跳轉到內容

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 秒以上,它自行結束了。

華夏公益教科書