Linux使用信號與系統上運行的進程進行通訊。
可使用這些信號控制Shell腳本的運行,只須要讓shell腳本在接收到來自Linux系統的特定信號時執行命令便可。shell
編號編程 |
信號名稱安全 |
缺省操做bash |
解釋測試 |
POSIXspa |
1命令行 |
SIGHUP3d |
Terminatehtm |
掛起控制終端或進程 |
是 |
2 |
SIGINT |
Terminate |
來自鍵盤的中斷 |
是 |
3 |
SIGQUIT |
Dump |
從鍵盤退出 |
是 |
4 |
SIGILL |
Dump |
非法指令 |
是 |
5 |
SIGTRAP |
Dump |
跟蹤的斷點 |
是 |
6 |
SIGABRT |
Dump |
異常結束 |
是 |
6 |
SIGIOT |
Dump |
等價於SIGABRT |
是 |
7 |
SIGBUS |
Dump |
總線錯誤 |
是 |
8 |
SIGFPE |
Dump |
浮點異常 |
是 |
9 |
SIGKILL |
Terminate |
強迫進程終止 |
是 |
10 |
SIGUSR1 |
Terminate |
對進程可用 |
是 |
11 |
SIGSEGV |
Dump |
無效的內存引用 |
是 |
12 |
SIGUSR2 |
Terminate |
對進程可用 |
是 |
13 |
SIGPIPE |
Terminate |
向無讀者的管道寫 |
是 |
14 |
SIGALRM |
Terminate |
實時定時器時鐘 |
是 |
15 |
SIGTERM |
Terminate |
進程終止 |
是 |
16 |
SIGSTKFLT |
Terminate |
協處理器棧錯誤 |
是 |
17 |
SIGCHLD |
Ignore |
子進程中止、結束或在被跟蹤時得到信號 |
是 |
18 |
SIGCONT |
Continue |
若是已中止則恢復執行 |
是 |
19 |
SIGSTOP |
Stop |
中止進程執行 |
是 |
20 |
SIGTSTP |
Stop |
從tty發出中止進程 |
是 |
21 |
SIGTTIN |
Stop |
後臺進程請求輸入 |
是 |
22 |
SIGTTOU |
Stop |
後臺進程請求輸出 |
是 |
23 |
SIGURG |
Ignore |
套接字上的緊急條件 |
否 |
24 |
SIGXCPU |
Dump |
超過CPU時限 |
否 |
25 |
SIGXFSZ |
Dump |
超過文件大小的限制 |
否 |
26 |
SIGVTALRM |
Terminate |
虛擬定時器時鐘 |
否 |
27 |
SIGPROF |
Terminate |
概況定時器時鐘 |
否 |
28 |
SIGWINCH |
Ignore |
窗口調整大小 |
否 |
29 |
SIGIO |
Terminate |
I/O如今可能發生 |
否 |
29 |
SIGPOLL |
Terminate |
等價於SIGIO |
否 |
30 |
SIGPWR |
Terminate |
電源供給失敗 |
否 |
31 |
SIGSYS |
Dump |
壞的系統調用 |
否 |
31 |
SIGUNUSED |
Dump |
等價於SIGSYS |
否 |
Bashshell可使用鍵盤上的組合鍵生成兩個基本的Linux信號。若是須要中止或暫停失控的程序,那麼這個功能會被用上。
2.1 中斷進程
使用Ctrl+C組合鍵能夠生成SIGINT信號,並將其發送給當前正在shell中運行的任意進程。運行一個一般須要很長時間才能完成的命令並按Ctrl+C組合鍵,能夠測試此操做。
Ctrl+C組合鍵不會在監視器上生成任何輸出,它只會中止當前在shell中運行的進程。sleep命令在指定的秒數以內暫停操做。
一般,命令提示符在計時器過時以前不會返回。在計時器過時以前按Ctrl+C組合鍵,可使sleep命令提早終止。
2.2 暫停進程
Ctrl+Z組合鍵生成SIGSTP信號,能夠中止任何在shell中運行的進程。中止進程與終止進程不一樣,中止進程後程序任然留在內存中,可以從中止的地方繼續運行。
方括號中的數字是shell分配的做業編號(jobnumber)。
shell以做業(job)形式引用shell中運行的每一個進程,向每一個做業分配惟一的做業編號。
它向第一個啓動的進程分配做業編號1,向第二進程分配做業編號2,以此類推。
若是shell會話中有一箇中止的做業,在退出shell時bash將發出警告。使用ps命令查看中止的做業:
在S列(進程狀態),ps命令將已中止做業的狀態顯示爲T
若是想在中止做業仍處於活動狀態時退出shell,只須要再次鍵入exit命令。shell將退出,並終止亭子的做業。還有一種方法是知道中止做業的PID,使用kill命令發送SIGKILL信號來終止它。
2.3 捕獲信號
除了可使腳本忽略信號以外,還能夠在信號出現時捕獲信號和執行其餘命令。
trap命令能夠指定可以經過shell腳本監控和攔截的Linux信號。若是腳本收到trap命令中列出的信號,它將保護該信號不被shell處理,並在本地處理它。
trap命令格式:trap commands signals。在trap命令行中,只須要列出但願shell執行的命令,以及但願捕獲的信號列表(以空格分隔)。指定信號能夠經過它們的數值或Linux信號名實現。
當每次檢測到SIGINT和SIGTERM信號時顯示一個簡單的文本消息。若是捕獲到這些信號,在用戶試圖使用bash shell鍵盤Ctrl+C命令中止程序時,腳本將不受影響。每次使用Ctrl+C組合鍵時,腳本執行trap命令中指定的echo語句,而不是忽略信號並容許shell中止腳本。
2.4 捕獲腳本退出
除了在shell腳本中捕獲信號以外,能夠在shell腳本退出時捕獲它們。這是一種在shell完成做業時執行命令的便捷方式。要捕獲shell腳本退出,只須要向trap命令添加EXIT信號。
當腳本到達常規退出點時,就會觸發trap,shell將執行在trap命令行中指定的命令。
若是提早退出腳本,也可以捕獲EXIT。使用Ctrl+C組合鍵發送SIGINT信號時,腳本退出,可是在腳本退出以前,shell將執行trap命令。
2.5 移除捕獲
要移除捕獲,使用破折號做爲命令和想要恢復正常行爲的信號列表。
信號捕獲移除後,腳本將忽略信號。可是,若是在移除捕獲以前收到信號,腳本仍將根據trap命令處理該信號。
使用ps命令,能夠查看Linux系統上運行的進程。全部進程不在終端監視器上運行。這就是所謂的後臺運行進程。在後臺模式中,進程運行時與終端會話STDIN、STDOUT和STDERR無關。
經過命令行界面之後臺模式運行shell界面,只須要在命令後加上一個&符號。
將&符號放在命令以後時,它將bashshell與命令相分離,並以獨立的後臺進程形式在系統上運行。
顯示的一行相似:[1] 19555,方括號的數字是shell分配給後臺的做業編號。後面的數字是LInux系統分配給進程的PID。全部Linux系統上運行的進程都必須有惟一的PID。
系統顯示這些條目以後,將出現一個新的命令行界面提示符。執行的命令將之後模式安全運行。
這是,能夠在提示符處輸出新的命令,可是後臺進程仍在運行,任然使用終端監視器顯示STDOUT和STDERR消息。
後臺進程結束時,在終端顯示消息格式:[1]+ Done ./test 這表示做業編號和做業狀態(Done),以及用於啓動該做業的命令。
能夠經過命令行提示符同時啓動任何數量的後臺做業。每次啓動一個新做業時,Linux系統將分配一個新做業編號和一個PID。使用ps命令能夠查看運行的全部腳本。
啓動的每一個後臺進程都出如今ps命令的運行進程輸出列表中。若是全部進程都在終端會中顯示輸出,那會變成一團糟。
注意ps命令的輸出,每一個後臺進程都鏈接着一個終端會話(pts/0)終端。若是終端會話退出,則後臺進程將退出。若是與終端相關聯的後臺程序正在運行,有些終端模擬器會發出警告,而有些則不會。若是但願在註銷控制檯後腳本繼續之後太模式運行,則須要執行一些其餘操做。
有時須要從終端啓動shell腳本,而後讓腳本結束以前之後臺模式運行,即便退出終端會話也是如此。
nohup命令運行另外一個命令阻塞發送到進程的任何SIGHUP信號。這能夠防止在退出終端會話時退出進程。nohup命令格式:nohup test.sh &nohupm命令將進程與終端斷開,因此進程沒有STDOUT和STDERR輸出連接。爲了接收命令生成的任何輸出,nohup命令自動將STDOUT和STDERR消息衝向的到稱爲nohup.out的文件。nohup.out文件包含一般發送到終端監視器的全部輸出。進程運行完成後,能夠打開nohup.out文件查看輸出結果。