Shell 信號發送與捕捉

防僞碼:李白乘舟將欲行,忽聞岸上踏歌聲。
shell

9.1 Linux  信號類型數組

信號(Signal):信號是在軟件層次上對中斷機制的一種模擬,經過給一個進程發送信號,執行響bash

應的處理函數。socket

進程能夠經過三種方式來響應一個信號:ide

1)忽略信號,即對信號不作任何處理,其中有兩個信號不能忽略:SIGKILL 及 SIGSTOP。函數

2)捕捉信號。spa

3)執行缺省操做,Linux 對每種信號都規定了默認操做。調試

Linux 究竟採用上述三種方式的哪個來響應信號呢?取決於傳遞給響應 API 函數的參數。日誌

Linux 支持的信號有:隊列

編號  信號名稱  缺省動做  描述

1  SIGHUP  終止  終止進程,掛起

2  SIGINT  終止  鍵盤輸入中斷命令,通常是 CTRL+C

3  SIGQUIT  CoreDump  鍵盤輸入退出命令,通常是 CTRL+\

4  SIGILL  CoreDump  非法指令

5  SIGTRAP  CoreDump  trap 指令發出,通常調試用

6  SIGABRT  CoreDump  abort(3)發出的終止信號

7  SIGBUS  CoreDump  非法地址

8  SIGFPE  CoreDump  浮點數異常

9  SIGKILL  終止  當即中止進程,不能捕獲,不能忽略

10  SIGUSR1  終止

用戶自定義信號 1,像 Nginx 就支持 USR1 信號,用於重載配

置,從新打開日誌

11  SIGSEGV  CoreDump  無效內存引用

12  SIGUSR2  終止  用戶自定義信號 2

13  SIGPIPE  終止  管道不能訪問

14  SIGALRM  終止  時鐘信號,alrm(2)發出的終止信號

15  SIGTERM  終止

終止信號,進程會先關閉正在運行的任務或打開的文件再終

止,有時間進程在有運行的任務而忽略此信號。不能捕捉

16  SIGSTKFLT  終止  處理器棧錯誤

17  SIGCHLD  可忽略  子進程結束時,父進程收到的信號

18  SIGCONT  可忽略  讓終止的進程繼續執行

19  SIGSTOP  中止  中止進程,不能忽略,不能捕獲

20  SIGSTP  中止  中止進程,通常是 CTRL+Z

21  SIGTTIN  中止  後臺進程從終端讀數據

22  SIGTTOU  中止  後臺進程從終端寫數據

23  SIGURG  可忽略  緊急數組是否到達 socket

24  SIGXCPU  CoreDump  超出 CPU 佔用資源限制

25  SIGXFSZ  CoreDump  超出文件大小資源限制

26  SIGVTALRM  終止

虛擬時鐘信號,相似於 SIGALRM,但計算的是進程佔用的時

27  SIGPROF  終止  相似與 SIGALRM,但計算的是進程佔用 CPU 的時間

28  SIGWINCH  可忽略  窗口大小改變發出的信號

29  SIGIO  終止  文件描述符準備就緒,能夠輸入/輸出操做了

30  SIGPWR  終止  電源失敗

31  SIGSYS  CoreDump  非法系統調用

CoreDump(核心轉儲):當程序運行過程當中異常退出時,內核把當前程序在內存情況存儲在一個

core 文件中,以便調試。

Linux 支持兩種信號:

一種是標準信號,編號 1-31,稱爲非可靠信號(非實時),不支持隊列,信號可能會丟失,好比發

送屢次相同的信號,進程只能收到一次,若是第一個信號沒有處理完,第二個信號將會丟棄。

另外一種是擴展信號,編號 32-64,稱爲非可靠信號(實時),支持隊列,發多少次進程就能夠收到

多少次。

信號類型比較多,咱們只要瞭解下,記住幾個經常使用信號就好了,紅色標記的我以爲須要記下。

發送信號通常有兩種狀況:

一種是內核檢測到系統事件,好比鍵盤輸入 CTRL+C 會發送 SIGINT 信號。

另外一種是經過系統調用 kill 命令來向一個進程發送信號。

l 9.2 kill  命令

kill 命令發送信號給進程。

命令格式:kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l

[sigspec]

-s # 信號名稱

-n # 信號編號

-l # 打印編號 1-31 信號名稱

示例:

給一個進程發送終止信號:

kill -s SIGTERM pid

kill -n 15 pid

kill -15 pid

kill -TREM pid

p 9.3 trap  命令

trap 命令定義 shell 在處理程序運行時接受信號,來作相應的處理。

命令格式:trap [-lp] [[arg] signal_spec ...]

-l # 打印編號 1-64 編號信號名稱

arg # 捕獲信號後執行的命令或者函數

signal_spec # 信號名或編號

通常捕捉信號後,作如下幾個行動:

1)清除臨時文件

2)忽略該信號

3)詢問用戶是否終止腳本執行

示例 1:按 CTRL+C 不退出循環

#!/bin/bash

trap "" 2 # 不指定 arg 就不作任何操做,後面也能夠寫多個信號,以空格分隔

for i in {1..10}; do

echo $i

sleep 1

done

# bash a.sh

1

2

3

^C4

5

6

^C7

8

9

10

示例 2:循環打印數字,按 CTRL+C 退出,並打印退出提示

#!/bin/bash

trap "echo 'exit...';exit" 2

for i in {1..10}; do

echo $i

sleep 1

done

# bash test.sh

1

2

3

^Cexit...

示例 3:讓用戶選擇是否終止循環

#!/bin/bash

trap "func" 2

func() {

read -p "Terminate the process? (Y/N): " input

if [ $input == "Y" ]; then

exit

fi

}

for i in {1..10}; do

echo $i

sleep 1

done

# bash a.sh

1

2

3

^CTerminate the process? (Y/N): Y

# bash a.sh

1

2

3

^CTerminate the process? (Y/N): N

4

5

6

...

謝謝觀看,真心的但願能幫到您!

相關文章
相關標籤/搜索