10. 任务控制

上一节学习了 Linux 的多用户特性,本节学习 Linux 的多任务特性。 以下命令可以控制进程:

  • ps:列出系统中正在运行的进程
  • kill:向一个或多个进程发送信号(通常是「杀死」一个进程)
  • jobs:列出进程的另一个方式
  • bg:将一个进程放到后台执行
  • fg:将一个进程放到前台执行

将程序放到后台

$ command &

将会返回一个进程号,然后回到命令提示行。 如果你没有使用 &,你可以先输入 Ctrl+z,程序将中止,此时进程仍然存在,但是处于空闲状态。要将进程切到后台,输入 bg 命令(background 缩写)即可。

列出你的进程

我们可以使用 jobs 或更强大的 ps 命令来列出运行中的进程。

$ jobs
$ ps

杀死进程

当有进程没有响应时,你可以使用 kill 命令杀死它。首先,你可以使用 jobsps 命令找到该进程。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

results matching ""

    No results matching ""