Linux 进程管理
Linux 中命令便是程序,执行一个程序可以启动一个或多个进程。
查看进程
w
查看当前登录的用户信息
pidof
根据程序名查找该程序启动的进程的 PID
# 查看 VBoxClient 程序启动的所有进程的 PID
[yumanli@punk ~]$ pidof VBoxClient
2165 2161 2158 2156 2152 2151 2141 2139
ps
查看当前时间的进程快照
- UID: 用户名
- PID: 进程号
- PPID: 父进程号
- TTY: 哪个终端
- TIME: 进程运行了多久
- CMD: 产生该进程的程序名(一个程序可以产生多个进程)
ps
不加参数只列出当前用户在当前终端的进程
ps -ef
列出所有用户在所有终端的所有进程
ps -efH
以乔木状列出所有进程
ps -u user1
查看 user1 用户启动的进程
ps -aux
通过 cpu 和内存使用来过滤进程
ps -axjf
以树形结构显示进程
pstree
以树形结构显示进程
# 查看进程
ps -ef | less
# 查看 root 用户启动的进程
ps -u root
# 根据 cpu 使用率来降序排列
ps -aux --sort -pcpu | less
# 根据 内存使用率来升序排列
ps -aux --sort +pmem | less
# 将 cpu 和内存使用率合并到一起,并通过管道显示前 10 个结果
ps -aux --sort -pcpu,+pmem | head
top
查看进程的动态列表,不会显示全部进程,只显示排在前面的进程
交互命令:
- q: 退出
- h: 帮助
- u: 过滤用户
- k: 结束进程
第三方进程管理软件
glances htop
终止进程
Ctrl + C
Ctrl + C
终止终端中正在运行的进程
kill
kill PID
根据进程 PID 终止进程
标准的 kill
命令通常都能达到目的。终止有问题的进程,并把进程的资源释放给系统。然而,如果进程启动了子进程,只杀死父进程,子进程仍在运行,因此仍消耗资源。为了防止这些所谓的“僵尸进程”,应确保在杀死父进程之前,先杀死其所有的子进程。
# 根据程序名字查看进程 PID
ps -ef | grep httpd
# 终止进程
kill 9000
# 可以同时结束多个进程
kill 9000 9001 9002
kill -9 PID
强制结束进程
这个强大和危险的命令迫使进程在运行时突然终止,进程在结束后不能自我清理。危害是导致系统资源无法正常释放,一般不推荐使用,除非其他办法都无效。
当使用此命令时,一定要通过 ps -ef
确认没有剩下任何僵尸进程。只能通过终止父进程来消除僵尸进程。如果僵尸进程被 init
收养,问题就比较严重了。杀死 init
进程意味着关闭系统。
如果系统中有僵尸进程,并且其父进程是 init
,而且僵尸进程占用了大量的系统资源,那么就需要在某个时候重启机器以清除进程表了。
killall
killall 程序名
根据程序名终止该程序启动的所有进程
killall httpd
关闭重启系统
关机:
- init 0 平稳关机,推荐使用
- shutdown -h 等价于 init 0
- halt -p 强制关机,不推荐
- poweroff 直接关电源,不推荐
重启:
- init 6 平稳重启,推荐使用
- showdown -r 等价于 init 6
- reboot 强制重启,不推荐
后台运行进程
&
在命令最后加上 &
符号,即可在后台运行该命令的所有进程。
# 在后台运行 find 命令,后台运行的进程的输出结果仍然会显示到终端界面
sudo find / -name *.log &
# 使用输出重定向,将输出结果和错误信息都保存到文件,这样就不会显示到终端页面
sudo find / -name *.log > result 2>&1 &
通过 &
符号运行的后台进程与终端相关联,一旦终端关闭或者用户登出,则进程关闭。当用户注销或者网络断开时,终端会收到 HUP 信号从而关闭其所有进程。终端被关闭时也会关闭其所有进程。
nohup
nohup 命令
在后台运行该命令的所有进程,输出结果不会输出到终端,会输出到 nohup.out 文件。进程不受 HUP 信号影响,要想结束进程可以用 kill
命令。
nohup
可以和 &
一起使用
nohup cp file file_copy &
bg
bg
使前台命令转到后台执行
bg %1
可以指定命令的序列号,这个序列号是当前终端执行的命令的序列号,不是 PID。如果不指定序列号,则作用于最近使用的命令。
如果你原本想在后台运行一个命令,但是忘了加 &
符号了,可以按照以下顺序操作:
# 将命令转入后台,并且暂停命令
Ctrl + Z
# 将命令转为执行
bg
fg
fg
使后台命令转到前台执行,不管后台命令的状态如何,转到前台之后都会直接运行。
fg %1
可以指定命令的序列号,这个序列号是当前终端执行的命令的序列号,不是 PID。如果不指定序列号,则作用于最近使用的命令。
jobs
jobs
显示当前终端里的后台进程的状态
进程状态:
- 运行:R
- 休眠:S
- 不可中断:D 进程不响应系统异步信号,即便是
kill
命令也无法终止进程 - 僵死:Z 进程已终止,但是进程描述符依然存在,直到父进程调用 wait4() 系统函数后释放该进程
- 停止:T 进程收到 SIGSTOP SIGSTP SIGTIN SIGOU 等停止信号后停止运行