如何在 Linux 中使用 SIGINT 和其他終止信號
你應(yīng)該使用過 ctrl + c 來終止進(jìn)程,但是你知道它會(huì)發(fā)送 SIGINT 信號嗎?
除了發(fā)送 SIGINT 信號(ctrl +c)以外,還有很多其他的終止信號,今天我們就來介紹下終止信號。
在 Linux 中使用終止信號
我們通常使用 kill 命令來終止進(jìn)程,kill 命令可用的信號超過 50 個(gè):
使用 kill 命令可以使用這些信號代碼來代替信號名稱。比如,如果我們想要停止執(zhí)行某個(gè)進(jìn)程,那么可以使用 SIGTSTP,如下所示:
以上是使用信號名稱(SIGTSTP),另外也可以使用它對應(yīng)的代碼 20,結(jié)果是相同的,如下:
下面我們介紹一些常用的信號,首先看一下 SIGSTP。
使用 SIGSTP 終止進(jìn)程
首先我們從前臺進(jìn)程開始。
與終止后臺進(jìn)程相比,終止前臺進(jìn)程更加簡單,只需要使用綁定的快捷鍵即可。
執(zhí)行 SIGTSTP 的快捷鍵是 ctrl +z。比如,作為演示,我們使用 sleep 命令:
上面的例子中,我們使用了 jobs 命令,這是一個(gè)很有用的工具,可以顯示正在運(yùn)行和最近終止的進(jìn)程。
那么,如何終止后臺進(jìn)程呢?需要使用?? kill 命令??,使用 SIGTSTP 指定 PID 或者 JOBID,如下所示:
使用 SIGCONT 恢復(fù)命令執(zhí)行
SIGCONT 可以幫助恢復(fù)最近終止執(zhí)行的命令。如下所示:
使用 SIGINT 終止執(zhí)行
這是我使用最多的用于終止的命令。我們舉個(gè)例子,如下:
但 SIGINT 也不是萬能的,它在某些地方不起作用,比如 bash 解釋器中。比如,下面這個(gè) bash 腳本用于接受用戶輸入:
如上圖所示,當(dāng)我按下 ctrl + c 時(shí),它顯示當(dāng)前的日期和時(shí)間,只有當(dāng)我輸入了某些信息時(shí),它才停止。
使用 SIGQUIT 終止
SIGQUIT 類似于 SIGINT,但它也會(huì)在執(zhí)行前生成一個(gè)核心轉(zhuǎn)儲(chǔ)(core dump)。
簡單地說,核心轉(zhuǎn)儲(chǔ)是在系統(tǒng)崩潰或進(jìn)程終止之前自動(dòng)生成的文件。
它可以通過快捷鍵 ctrl + \ 來觸發(fā),可以用來終止前臺進(jìn)程和后臺進(jìn)程。
看下面的例子:
上述例子是終止一個(gè)前臺進(jìn)程,那么怎樣用它來終止后臺進(jìn)程呢?看如下語法:
使用 SIGTERM 終止執(zhí)行
顧名思義,這是一個(gè)終止程序的終止信號,但與 SIGKILL(不管怎樣都會(huì)終止程序)不同,這是要求終止程序相對柔和的方式。
有時(shí)它會(huì)在終止前進(jìn)行清理,其語法如下所示:
使用 SIGKILL
SIGKILL 可以即時(shí)強(qiáng)制殺掉任何子進(jìn)程。
有時(shí)候,我們可能會(huì)遇到這樣的問題:有些程序根本無法運(yùn)行,而且根本無法終止!
這種情況下,我們就可以使用 SIGKILL 來強(qiáng)制殺掉進(jìn)程。其使用語法如下所示: