進(jìn)程(五):向進(jìn)程發(fā)送信號(hào)

我們可以使用鍵盤(pán)或者 pkill 命令、kill 命令和 killall 命令向進(jìn)程發(fā)送各種信號(hào)。

在 Bash 下,我們可以使用鍵盤(pán)發(fā)送信號(hào),如下所示:

組合鍵 含義
Ctrl + C 中斷信號(hào),發(fā)送 SIGINT 信號(hào)到運(yùn)行在前臺(tái)的進(jìn)程
Ctrl + Y 延時(shí)掛起信號(hào),使運(yùn)行的進(jìn)程在嘗試從終端讀取輸入時(shí)停止。</br>控制權(quán)返回給 Shell,使用戶可以將進(jìn)程放在前臺(tái)或后臺(tái),或殺掉該進(jìn)程
Ctrl + Z 掛起信號(hào),發(fā)送 SIGTSTP 信號(hào)到運(yùn)行的進(jìn)程,由此將其停止,并將控制權(quán)返回給 Shell

大多數(shù)主流的 Shell,包括 Bash,都有內(nèi)置的 kill 命令。Linux 系統(tǒng)中,也有 kill 命令,即 /bin/kill。如果使用 /bin/kill,則系統(tǒng)可能會(huì)激活一些額外的選項(xiàng),比如,殺掉不是你自己的進(jìn)程,或指定進(jìn)程名稱作為參數(shù),類似于 pgrep 和 pkill 命令。不過(guò)兩種 kill 命令默認(rèn)都是發(fā)送 SIGTERM 信號(hào)。

當(dāng)準(zhǔn)備殺掉一個(gè)進(jìn)程或一連串的進(jìn)程時(shí),我們的常識(shí)是從嘗試發(fā)送最安全的信號(hào)開(kāi)始,即 SIGTERM 信號(hào)。以這種方式,能夠正常停止運(yùn)行的程序,當(dāng)它收到 SIGTERM 信號(hào)時(shí),有機(jī)會(huì)按照已經(jīng)設(shè)計(jì)好的流程執(zhí)行,比如,清理和關(guān)閉打開(kāi)的文件。如果我們發(fā)送一個(gè) SIGKILL 信號(hào)到進(jìn)程,你將消除進(jìn)程先清理而后關(guān)閉的機(jī)會(huì),而這可能會(huì)導(dǎo)致不可預(yù)知的結(jié)果。但如果一個(gè)有序地終結(jié)不管用,那么發(fā)送 SIGINT 或 SIGKILL 信號(hào)就可能是唯一的方法了。例如,當(dāng)一個(gè)前臺(tái)進(jìn)程使用 Ctrl + C 組合鍵殺不掉時(shí),那么最好就是使用命令 “kill -9 PID” 了。

kill 命令可以發(fā)送多種信號(hào)到進(jìn)程。特別有用的信號(hào)包括:

  • SIGHUP(1)
  • SIGINT(2)
  • SIGKILL(9)
  • SIGCONT(18)
  • SIGSTOP(19)

在 Bash 中,信號(hào)名或信號(hào)值都可以作為 kill 命令的選項(xiàng),而作業(yè)號(hào)或進(jìn)程號(hào)則作為 kill 命令的參數(shù)。

實(shí)例1:發(fā)送 SIGKILL 信號(hào)到 PID 是 123 的進(jìn)程:

kill -9 123

或是:

kill -KILL 123

也可以是:

kill -SIGKILL 123

實(shí)例2:使用 kill 命令終結(jié)一個(gè)作業(yè)。

實(shí)例2

注意:上面實(shí)例中“%”之后的是數(shù)字1。

killall 命令會(huì)發(fā)送信號(hào)到運(yùn)行任何指定命令的所有進(jìn)程。所以,當(dāng)一個(gè)進(jìn)程啟動(dòng)了多個(gè)實(shí)例時(shí),使用 killall 命令來(lái)殺掉這些進(jìn)程會(huì)更方便一些。

如果沒(méi)有指定信號(hào)名,killall 命令會(huì)默認(rèn)發(fā)送 SIGTERM 信號(hào)。例如,使用 killall 命令殺掉所有 firefox 進(jìn)程:

killall firefox

發(fā)送 KILL 信號(hào)到 firefox 的進(jìn)程:

killall -s SIGKILL firefox

使用 pkill 命令,可以通過(guò)指定進(jìn)程名、用戶名、組名、終端、UID、EUID和GID等屬性來(lái)殺掉相應(yīng)的進(jìn)程。pkill 命令默認(rèn)也是發(fā)送 SIGTERM 信號(hào)到進(jìn)程。

實(shí)例1:使用 pkill 命令殺掉所有用戶的 firefox 進(jìn)程:

pkill firefox

實(shí)例2:強(qiáng)制殺掉用戶 toby 的 firefox 進(jìn)程:

pkill -KILL -u toby firefox

實(shí)例3:讓 sshd 守護(hù)進(jìn)程重新加載它的配置文件:

pkill -HUP sshd

本文參考自 《Linux Shell命令行及腳本編程實(shí)例詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • linux資料總章2.1 1.0寫(xiě)的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無(wú)法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 13,330評(píng)論 2 33
  • 轉(zhuǎn)載一篇,最原始的出處已不可考,望見(jiàn)諒! 常規(guī)篇: 首先,用ps查看進(jìn)程,方法如下: $ ps -ef …… sm...
    奮斗青春無(wú)悔閱讀 882評(píng)論 0 6
  • 1、進(jìn)程 主要概念 進(jìn)程是正在運(yùn)行的可執(zhí)行程序的實(shí)例,通過(guò)進(jìn)程ID(pid)識(shí)別 LInux使用虛擬內(nèi)存,所以每個(gè)...
    lukeyan閱讀 660評(píng)論 0 0
  • 1 進(jìn)程介紹 1.1 進(jìn)程和程序 所謂進(jìn)程是由正文段(text)、用戶數(shù)據(jù)段(user segment)以及系統(tǒng)數(shù)...
    瘋狂小王子閱讀 1,360評(píng)論 0 7
  • 進(jìn)程相關(guān)概念系統(tǒng)進(jìn)程管理工具任務(wù)計(jì)劃 一、進(jìn)程相關(guān)概念 定義:進(jìn)程(Process)是運(yùn)行中的程序的一個(gè)副本,是被...
    哈嘍別樣閱讀 666評(píng)論 0 0

友情鏈接更多精彩內(nèi)容