跳转到内容

Unix 指南/命令/进程管理/Kill

来自维基教科书,开放的书籍,为开放的世界

kill 是一个 unix 命令,用于向正在运行的进程发送 unix 信号。默认情况下,它会尝试发送 TERM 信号,该信号会要求进程停止运行,因此得名 kill

可以使用 kill 命令查看可用的信号

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     17) SIGCHLD
18) SIGCONT     19) SIGSTOP     20) SIGTSTP     21) SIGTTIN
22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO
30) SIGPWR      31) SIGSYS      33) SIGRTMIN    34) SIGRTMIN+1
35) SIGRTMIN+2  36) SIGRTMIN+3  37) SIGRTMIN+4  38) SIGRTMIN+5
39) SIGRTMIN+6  40) SIGRTMIN+7  41) SIGRTMIN+8  42) SIGRTMIN+9
43) SIGRTMIN+10 44) SIGRTMIN+11 45) SIGRTMIN+12 46) SIGRTMIN+13
47) SIGRTMIN+14 48) SIGRTMIN+15 49) SIGRTMAX-15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
$

您可以向具有特定名称的所有进程发送给定信号,或者只向一个进程发送,指定其 PID。例如,如果您想向进程 23154 发送 SIGHUP 信号

kill -s SIGHUP 23154

如果您想向所有名为 Apache 的进程发送相同的信号

kill -s SIGHUP Apache

您还可以对 pid 进行分组,以上两个命令可以合并为

kill -s SIGHUP 23154 Apache


通过发出信号,您可以更好地控制系统。假设您有一个正在运行的脚本,其 PID 为 12345,该脚本使用了大量的 CPU,您想在做其他事情时将其“暂停”。您可以向您的进程发出 STOP 信号

kill -s STOP 12345

稍后要恢复它,您需要让进程继续工作

kill -s CONT 12345

示例

我们将启动一个简单的进程(sleep)作为后台进程(&)。sleep 进程什么也不做,只是等待给定的秒数(在本例中为 360 秒或 6 分钟)

$ sleep 360 &
[1] 7551
$

shell 会将进程的 PID(7551)返回给我们。让它运行一段时间,然后使用 ps 命令检查其状态

$ ps -o fname,pid,stat,etime
COMMAND    PID STAT     ELAPSED
bash      7425 Ss         04:47
sleep     7551 S          00:58
ps        7600 R+   49710-06:27:47
$

现在,我们要求进程暂停工作

$  kill -s STOP 7551

按 Enter 键更新输出缓冲区,shell 会给出确认

$
[1]+  Stopped                 sleep 360
$

一段时间后,我们的进程仍然处于停止状态

$ ps -o fname,pid,stat,etime
COMMAND    PID STAT     ELAPSED
bash      7425 Ss         10:37
sleep     7551 T          06:05
ps        7719 R+   49710-06:27:47
$

您可以注意到,尽管进程应该在 5 分钟后结束(请记住,我们使用了“sleep 360”),但自启动以来已经过去了 6 分钟。

现在,我们想让进程继续运行

$ kill -s CONT 7551

按 Enter 键更新缓冲区

$
[1]+  Done                    sleep 360
$

该进程完成了。当您发出 CONT 信号时,进程恢复并检查当前时间,由于已经过去了 360 秒以上,它自行结束了。

华夏公益教科书