Linux Shell腳本編程-信號捕獲


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[*]}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM