Linux 的任务管理器

在 Windows 里,按 Ctrl+Alt+Delete 可以调出“任务管理器”。但是在 Linux 里按同样的按键是注销(图形界面)/重启(文本界面)。怎么管理进程和杀进程?

ps

ps 是一个用来查看进程列表的命令。和 Windows 的 tasklist 类似。

一般情况下,使用 ps 时后面要跟一些参数。常用的是 ps -auxps -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 信号,强迫进程停止。这个命令可以用于对付无法正常结束的进程。