iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 23
2

前言

接下來一連好幾天都要講 Shell 該怎麼處理 Signal,各位還記得之前在 Day04 有講過基本的 Process 觀念嗎,而 Process 之間如果要做簡單的溝通,其中一種方式就是透過 Signal

什麼時候會用到 Signal

Signal 是 Linux 中最重要的機制之一,平常在使用 Linux 時應該有滿多機會用到 Signal 提供的功能,只是很多人都不知道那些功能背後的原理就是 Signal,下面簡單舉幾個例子

  • 終止正在執行的程式(Ctrl-C)

    這應該是大家最常用的功能,如果想把正在執行的程式停掉,譬如說 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 有哪幾種

每個系統的 Signal 種類大同小異,知道比較常用的幾個就差不多了

  • SIGINT(中斷)

    INT 是 Interrupt 的意思,這個 Signal 通常會用來終止 Process,而且 允許 Process 在死掉之前完成他的遺願XD,就像 Word 在你按叉叉時會問你要不要儲存變更,而不是馬上結束

  • SIGKILL(立即中止)

    KILL 就是直接殺掉的意思,可以把他當成是 SIGINT 的加強版,他會 直接、立刻、馬上 把 Process 殺掉且 不給他任何辯解的機會,就像是 Windows 的立即中止,想當然編輯到一半的資料也會直接不見,所以一般不建議使用這個 Signal

  • SIGTSTP(暫停)

    TSTP 是 Terminal Stop 的意思,如上面的範例所說,他的功能就是 暫停 一個 Process

  • SIGCONT(繼續)

    CONT 是 Continue 的意思,這應該很明顯了就是讓 Process 繼續跑XD

其實這些 Signal 在網路上都可以查到所以不需要背,常用就會不小心記起來了

kill

除了在終端機上使用快捷鍵之外,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 一模一樣

htop

如果不想動手敲 kill 指令的話也可以用我在 Day04 提到的 htop

htop 的 <F9> Kill 可以直接發送 Signal 給某個 Process,像我下面的例子就是送 SIGKILL 給 ping Process,他也不意外地馬上被殺掉

小結

關於 Signal 的基本的知識就介紹到這邊,明後兩天會講在 Shell 裡面要怎麼轉發 Signal,讓使用者在按下快捷鍵時可以做出正確的行為

延伸閱讀


上一篇
Day22-Redirect Stdin(二)
下一篇
Day24-Signal 訊號(二)
系列文
Gosh!原來用 Go 寫一個 Unix Shell 這麼簡單30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言