接下來一連好幾天都要講 Shell 該怎麼處理 Signal,各位還記得之前在 Day04 有講過基本的 Process 觀念嗎,而 Process 之間如果要做簡單的溝通,其中一種方式就是透過 Signal
Signal 是 Linux 中最重要的機制之一,平常在使用 Linux 時應該有滿多機會用到 Signal 提供的功能,只是很多人都不知道那些功能背後的原理就是 Signal,下面簡單舉幾個例子
這應該是大家最常用的功能,如果想把正在執行的程式停掉,譬如說 ping google.com
,那只要按 <Ctrl>-C
就可以
當你按下 <Ctrl>-C
時 Terminal 會發送了一個 SIGINT(中斷訊號) 給 Shell,Shell 再把 SIGINT 轉發給 ping
process,最後 ping
process 收到後就會自己停掉(當然他也可以選擇不停XD,但大部分程式都會)
如果你不想讓 Process 終止,只是想先暫停一下,那可以按 <Ctrl>-Z
發送一個 SIGTSTP(暫停訊號) 給正在跑的 Process,他就會被暫停並且 被 zsh 放到背景,這時就可以先下別的指令
若想繼續跑剛剛暫停的程式可以下指令 fg
(foreground),他會送一個 SIGCONT(繼續訊號) 給剛剛暫停的 Process,然後該 Process 就會 被 zsh 叫到前景(foreground) 繼續跑
仔細比較上下這兩張圖會發現他們的
icmp_seq
編號是連續的,可見真的是繼續執行而非另外跑一個新 Process
以上這些功能背後都是藉由 Signal 在運作,只是大多時候使用者不會意識到
每個系統的 Signal 種類大同小異,知道比較常用的幾個就差不多了
INT 是 Interrupt 的意思,這個 Signal 通常會用來終止 Process,而且 允許 Process 在死掉之前完成他的遺願XD,就像 Word 在你按叉叉時會問你要不要儲存變更,而不是馬上結束
KILL 就是直接殺掉的意思,可以把他當成是 SIGINT 的加強版,他會 直接、立刻、馬上 把 Process 殺掉且 不給他任何辯解的機會,就像是 Windows 的立即中止,想當然編輯到一半的資料也會直接不見,所以一般不建議使用這個 Signal
TSTP 是 Terminal Stop 的意思,如上面的範例所說,他的功能就是 暫停 一個 Process
CONT 是 Continue 的意思,這應該很明顯了就是讓 Process 繼續跑XD
其實這些 Signal 在網路上都可以查到所以不需要背,常用就會不小心記起來了
除了在終端機上使用快捷鍵之外,Linux 也提供一個 kill
指令可以發送 Signal
譬如說我的 Term1(左上) 正在跑 ping google.com
,但想在 Term2(右下) 把它終止,這時可以用 ps
找到 ping google.com
的 PID(Process ID)
得到 PID 是 3448 之後再下指令 kill -INT 3448
,意思是發送 SIGINT(中斷訊號) 給 3448 號 Process,這樣他就會被終止,效果跟在 Term1 按 <Ctrl>-C
一模一樣
如果不想動手敲 kill
指令的話也可以用我在 Day04 提到的 htop
htop 的 <F9> Kill
可以直接發送 Signal 給某個 Process,像我下面的例子就是送 SIGKILL 給 ping
Process,他也不意外地馬上被殺掉
關於 Signal 的基本的知識就介紹到這邊,明後兩天會講在 Shell 裡面要怎麼轉發 Signal,讓使用者在按下快捷鍵時可以做出正確的行為