在 Windows 里,按 Ctrl+Alt+Delete 可以调出“任务管理器”。但是在 Linux 里按同样的按键是注销(图形界面)/重启(文本界面)。怎么管理进程和杀进程?
ps
ps 是一个用来查看进程列表的命令。和 Windows 的 tasklist 类似。
一般情况下,使用 ps 时后面要跟一些参数。常用的是 ps -aux
和 ps -lax
。
ps 和后面提到的命令都有很多附加参数。可以通过搜索引擎,或者 man 命令(如 man ps)获得帮助。
pstree
pstree 可以以进程树的形式列出当前进程。
kill
kill 可以杀死指定 PID 的进程。假如通过 ps 查到要杀死的进程 PID 为 1234,那么可通过kill 1234
结束进程。
killall 是通过进程名来杀死进程的命令。
xkill
xkill 是 X 环境的杀进程命令。只要输入 xkill,鼠标轻轻一点,鼠标指向的窗口(对应的进程)就立马被杀死了。
top
top 是一个交互式任务管理器。当然,纯文本界面的。
top 命令可以查看 CPU、内存等资源占用的实时状态,并且进行进程管理。
按“<”和“>”键翻页,按“k”然后输入进程 PID 可以杀死进程,按“q”退出。其余功能可看手册。
htop
htop 是一个类似的命令,不过 htop 比 top 现代多了。例如,htop 支持颜色,htop 支持鼠标……
注意
Unix 进程和 Windows 进程有一些不同之处,在杀进程时候务必注意一下。
进程树
在 Unix 和 Linux 中,进程之间具有父子关系。一旦父进程结束,子进程也会随之结束,这一点和 Windows 是很不一样的。
防止“连带”关系
这个技巧常用于远程连接。在远程连接过程中可能会执行一些耗时间的任务,一旦中断连接,负责远程连接的 shell 进程结束,它的子进程也就是我们的任务也会随之结束,因此要设法防止发生“连带关系”。
另外,耗时间的任务也会占用终端输入输出,所以有时候我们也希望它不要影响自己。
假如 python myprog.py 是一个很耗时的脚本:
python myprog.py &
:在命令后面加个“&”,可让命令在后台运行。(进程仍然存在父子关系)nohup python myprog.py &
:前面加“nohup”,后面加“&”,命令在后台运行,进程无父子关系。- Ctrl+Z:如果命令已在前台运行,按 Ctrl+Z 可将其休眠(暂停)。输入“jobs”查看已经休眠的进程,输入“fg”使进程恢复前台运行,输入“bg”使进程转入后台运行(父子关系不变),输入“exit”强制结束这些被休眠的进程。
- disown:如果命令已在前台运行,但是还需要退出终端,那么可以将进程休眠,通过 disown 命令使其脱离关系。disown 命令的参数与 jobs 的输出有关。
信号
Unix 和 Linux 有信号的概念。信号可以控制进程的运行。
如果想手动发送信号,可通过 kill 命令(因此 kill 不完全是一个杀进程的命令)。例如:
kill -STOP pid
:发送 SIGSTOP 信号,停止进程但不消灭进程。kill -CONT pid
:发送 SIGCONT 信号,重新开始已停止的进程。kill -KILL pid
:发送 SIGKILL 信号,强迫进程停止。这个命令可以用于对付无法正常结束的进程。