10. 任务控制
上一节学习了 Linux 的多用户特性,本节学习 Linux 的多任务特性。 以下命令可以控制进程:
ps
:列出系统中正在运行的进程kill
:向一个或多个进程发送信号(通常是「杀死」一个进程)jobs
:列出进程的另一个方式bg
:将一个进程放到后台执行fg
:将一个进程放到前台执行
将程序放到后台
$ command &
将会返回一个进程号,然后回到命令提示行。
如果你没有使用 &
,你可以先输入 Ctrl+z,程序将中止,此时进程仍然存在,但是处于空闲状态。要将进程切到后台,输入 bg
命令(background 缩写)即可。
列出你的进程
我们可以使用 jobs
或更强大的 ps
命令来列出运行中的进程。
$ jobs
$ ps
杀死进程
当有进程没有响应时,你可以使用 kill
命令杀死它。首先,你可以使用 jobs
或 ps
命令找到该进程。jobs
返回一个任务编号。ps
返回一个进程 ID。
# 得到进程编号,1 开始
$ jobs
# 杀死编号为 1 的进程
$ kill %1
# 得到进程 ID
$ ps
# 杀死进程 ID为 1293 的进程
$ kill 1293
kill 命令
kill
命令的真实意义是对进程发送 信号。大多数情况下信号的目的是让进程结束,但是还有其他功能。应用程序(如果他们是写的得当)会从操作系统监听信号并对信号作出反应。例如,文本编辑器可以监听到用户的登出操作,或者电脑关机。当收到信号时,它会在退出前保存进程中的工作内容。kill
命令可发送各种各样的信号给进程。输入:
$ kill -l
可以列出支持的信号列表。很多信号意思很朦胧,但是有几个是很有用的,需要了解:
信号编号 # | 名称 | 描述 |
---|---|---|
1 | SIGHUP | 挂起信号。程序可以监听此信号并对其作出响应。关闭终端时会向终端中运行的进程发送此信号 |
2 | SIGINT | 中断信号。用于中断进程。程序可以监听此信号并对其作出响应。你也可以通过在程序运行的终端窗口中输入 Ctrl+c 键来发送此信号 |
15 | SIGTERM | 终止信号。用于终止进程。程序可以监听此信号并对其作出响应。在没有指定信号的情况下,是 kill 命令的默认信号 |
9 | SIGKILL | 杀死信号。此信号会让 Linux 内核立即终止进程。应用程序不可以监听此信号 |
示例:
$ ps x | grep bad_program
$ kill -SIGTERM 2931
$ kill -SIGKILL 2931
在 SIGTERM 信号执行失败的情况下,使用 SIGKILL 信号。
示例中,ps
命令中的 x
选项用于列出所有进程(包括非本终端运行的)。通过 |
管道和 grep
命令来列出你想要终止的进程。由于 kill
默认是 SIGTERM
信号,你也可以直接使用:
$ kill 2931
也可以用信号编码来代替信号名:
$ kill -9 2931