簡介
首先我們先來看一段代碼,
#!/bin/bash declare -i uphosts=0 declare -i downhosts=0 for i in 192.168.152.{98..102}; do if ping -W 2 -c 1 $i &>/dev/null; then echo "$i is up." let uphosts++ else echo "$i is down." let downhosts++ fi done echo "Up hosts is $uphosts, down hosts is $downhosts."
該代碼針對一個IP地址段進行ping測驗,輸出IP地址在線與否并做統計,為了便于觀察效果,我們選擇的IP地址段較短,從192.168.152.98~102,其中只有主機地址為100(即本機)的主機在線,我們運行一遍看結果,
[root@c7-server ~]# bash trap1.sh 192.168.152.98 is down. 192.168.152.99 is down. 192.168.152.100 is up. 192.168.152.101 is down. 192.168.152.102 is down. Up hosts is 1, down hosts is 4.
接下來我們運行第二遍,在運行的程序中,我們使用Ctrl+c嘗試終止腳本的運行,
[root@c7-server ~]# bash trap1.sh 192.168.152.98 is down. ^C192.168.152.99 is down. 192.168.152.100 is up. 192.168.152.101 is down. ^C192.168.152.102 is down. Up hosts is 1, down hosts is 4.
當98和101主機地址結果顯示出來以后我們立即鍵入Ctrl+c(在上面的輸出結果上我對其進行了加粗標紅),鍵入后99和102的輸出結果立即顯示出來了(由于這是代碼塊展示,因此無法顯示出動態效果,大家看我描述腦補或者自行實驗),
我們可以發現Ctrl+c并沒有終止腳本的運行,而僅僅只是終止了當前回圈中的ping命令的執行,
如果我們想讓腳本本身停止,就需要使用bash內置命令trap來捕獲我們對腳本發出的Ctrl+c命令,
在我之前的一篇博客中《CentOS 7上的行程管理》已經有談到通過Ctrl+c命令結束正在執行中的腳本實際上是向腳本行程發出了SIGINT信號,
因此我們需要使用trap捕獲SIGINT信號并對其作出反應(在這里是嘗試結束腳本的執行),
trap語法如下,
trap [-lp] [[arg] signal_spec ...]
arg:當接受到指定的信號以后將要執行的命令;
signal_spec:具體的信號;
-l:列出所有的信號,類似于“kill -l”;
-p:列印出目前已經設定的陷阱,僅鍵入trap命令也有該效果,
[root@c7-server ~]# trap trap -- '' SIGTSTP trap -- '' SIGTTIN trap -- '' SIGTTOU [root@c7-server ~]# trap -p trap -- '' SIGTSTP trap -- '' SIGTTIN trap -- '' SIGTTOU
因此我們只需要在原本的腳本的頂部(shebang下面)寫入這樣的陷阱即可,
[root@c7-server ~]# cat trap1.sh #!/bin/bash trap "exit" SIGINT declare -i uphosts=0 declare -i downhosts=0 ... ...
結果如下,當腳本一收到SIGINT信號,立即結束腳本,即便回圈還未停止,
[root@c7-server ~]# bash trap1.sh 192.168.152.98 is down. ^C[root@c7-server ~]# [root@c7-server ~]#
對于信號捕捉(陷阱)trap的簡單介紹到此為止,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/232813.html
標籤:Linux
上一篇:解決了一個ssh登錄緩慢的問題
