自學Linux Shell15.1-處理信號

點擊返回 自學Linux命令行與Shell腳本之路html

15.1-處理信號

Linux使用信號與系統上運行的進程進行通訊。
可使用這些信號控制Shell腳本的運行,只須要讓shell腳本在接收到來自Linux系統的特定信號時執行命令便可。shell

1. 經常使用的Linux信號

編號編程

信號名稱安全

缺省操做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

  • 默認狀況下,bash shell會忽略它接收的任何SIGQUIT信號、SIGTERM信號(以防止交互的shell意外終止)。可是,bashshell處理它收到的任何SIGHUP、SIGINT信號。
  • 若是bash shell收到一個SIGHUP信號,它會退出。在退出以前,它將SIGHUP信號傳遞給shell啓動的任意進程(如shell腳本)。收到SIGINT信號,shell會當即中斷。Linux內核中止向shell提供CPU 上的處理時間。這種狀況下,shell將SIGINT信號傳遞給由shell啓動的人任意進程以通知它們這種狀況。
  • 默認的shell腳本行爲將忽略這些信號,這樣會對腳本運行產生不良影響。爲避免這種狀況發生,對腳本進行編程以識別信號,並執行命令以便腳本爲信號結果作好準備。

2. 生成信號

 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命令處理該信號。

3. 後臺模式下運行腳本

使用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)終端。若是終端會話退出,則後臺進程將退出。若是與終端相關聯的後臺程序正在運行,有些終端模擬器會發出警告,而有些則不會。若是但願在註銷控制檯後腳本繼續之後太模式運行,則須要執行一些其餘操做。

4. 非控制檯下運行腳本

有時須要從終端啓動shell腳本,而後讓腳本結束以前之後臺模式運行,即便退出終端會話也是如此。
nohup命令運行另外一個命令阻塞發送到進程的任何SIGHUP信號。這能夠防止在退出終端會話時退出進程。nohup命令格式:nohup test.sh &nohupm命令將進程與終端斷開,因此進程沒有STDOUT和STDERR輸出連接。爲了接收命令生成的任何輸出,nohup命令自動將STDOUT和STDERR消息衝向的到稱爲nohup.out的文件。nohup.out文件包含一般發送到終端監視器的全部輸出。進程運行完成後,能夠打開nohup.out文件查看輸出結果。

相關文章
相關標籤/搜索