bash編程的信號捕獲:
kill -l 顯示當前系統可用信號(trap -l)
獲取幫助:man 7 single
常用信號:
1) SIGHUP 無須重啟進程而讓其重讀配置文件
2) SIGINT 中斷正在運行的進程;相當於Ctrl+c
9) SIGKILL 強制殺死正在運行的進程(直接關閉進程)
15) SIGTERM 正常方式終止正在運行的進程(會關閉進程打開的文件等再終止進程)
18) SIGCONT 讓后台停止的進程繼續在后台運行,相當於bg命令
19) SIGSTOP 將前台進程轉入后台並停止運行,相當於Ctrl+Z
指定信號的方法:
信號的數字標識:1、2、9
信號完整名稱:SIGHUP
信號的簡寫名稱:HUP
捕獲到某種信號,執行相關操作,如果操作復雜可以寫成函數在調用函數
語法:trap 'COMMAND' SIGNAL
信號捕捉用於:在中止某個正在執行的腳本時,做一些清理操作(KILL信號是無法捕捉)
示例1:ping命令在腳本中Ctrl+C不能終止,用信號捕獲到SIGINT信號就打印退出信息和退出腳本
#!/bin/bash
#捕獲到SIGINT信號(按Ctrl+C時),就輸出"quit"同時執行"exit 5"退出腳本
trap 'echo "quit"; exit 5' SIGINT
for i in {1..254}; do
if ping -w 1 -c 1 172.16.254.$i &> /dev/null; then
echo "172.16.254.$i is up."
else
echo "172.16.254.$i is down."
fi
done
示例2:在接收到INT信號時,因為命令還沒有結束,但是又想把命令產生的文件刪除,則可以定義一個函數,在使用 trap 命令時直接調用函數即可
#!/bin/bash
#
mytrp() {
echo "Quit"
rm -f ${hostmpfiles[*]}
exit 1
}
declare -a hosmpfiles
trap 'mytrp' INT
for i in {100..250};do
tmpfile=$(mktemp /tmp/ping.XXXXXX)
if ping -c1 -W1 192.168.1.$i &> /dev/null; then
echo "192.168.1.$i is up" |tee $tmpfile
else
echo "192.168.1.$i is down" |tee $tmpfile
fi
hostmpfiles[${#hostmpfiles[*]}]=$tmpfile
done
rm -f ${hostmpfiles[*]}