信號(Signal):信號是在軟件層次上對中斷機制的一種模擬,經過給一個進程發送信號,執行相應的處理函數。shell
進程能夠經過三種方式來響應一個信號:數組
1)忽略信號,即對信號不作任何處理,其中有兩個信號不能忽略:SIGKILL及SIGSTOP。bash
2)捕捉信號。運維
3)執行缺省操做,Linux對每種信號都規定了默認操做。socket
Linux究竟採用上述三種方式的哪個來響應信號呢?取決於傳遞給響應的API函數。ide
Linux支持的信號有:函數
編號spa |
信號名稱調試 |
缺省動做日誌 |
描述 |
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命令來向一個進程發送信號。
博客地址:http://lizhenliang.blog.51cto.com
QQ羣:323779636(Shell/Python運維開發羣)
kill命令發送信號給進程。
命令格式:kill [-s sigspec | -n signum | -sigspec] pid | jobspec ...
kill -l [sigspec]
-s # 信號名稱
-n # 信號編號
-l # 打印編號1-31信號名稱
示例:
給一個進程發送終止信號: kill -s SIGTERM pid 或 kill -n 15 pid 或 kill -15 pid 或 kill -TREM pid
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 theprocess? (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 ...