程式扎記: [Linux 文章收集] Linux命令之trap

標籤

2016年8月23日 星期二

[Linux 文章收集] Linux命令之trap

Source From Here
Preface
trap 是一個 shell 內建命令,它用來在腳本中指定信號如何處理。比如,按 Ctrl+C 會使腳本終止執行,實際上系統發送了 SIGINT 信號給腳本進程,SIGINT 信號的默認處理方式就是退出程式。如果要在 Ctrl+C 不退出程式,那麼就得使用 trap 命令來指定一下 SIGINT 的處理方式了。trap 命令不僅僅處理 Linux 信號,還能對腳本退出(EXIT)、調試(DEBUG)、錯誤(ERR)、返回(RETURN)等情況指定處理方式。

常用參數
trap [-lp] [[arg] sigspec ...]

命令範例
底下針對常用命令使用方式進行介紹.

格式:trap "commandssignals
當 shell 接收到 signals 指定的信號時,執行 commands 命令。(The command arg is to be read and executed when the shell receives signal(s) sigspec. 

格式:trap signals
如果沒有指定命令部分,那麼就將信號處理復原。比如 trap INT 就表明恢復Ctrl+C退出。(If arg is absent (and there is a single sigspec) or -, each specified signal is reset to its original disposition (the value it had upon entrance to the shell). )

格式:trap "" signals
忽略信號 signals,可以多個,比如 trap "" INT 表明忽略 SIGINT 信號,按 Ctrl+C 也不能使腳本退出。又如 trap "" HUP 表明忽略 SIGHUP 信號,即網絡斷開時也不能使腳本退出。(If arg is the null string the signal specified by each sigspec is ignored by the shell and by the commands it invokes. )

格式:trap -p
格式:trap -p signal
把當前的 trap 設置列印出來。(If arg is not present and -p has been supplied, then the trap commands associated with each sigspec are displayed. If no arguments are supplied or if only -p is given, trap prints the list of commands associated with each signal.

格式:trap -l
把所有信號列印出來。(The -l option causes the shell to print a list of signal names and their corresponding numbers. Each sigspec is either a signal name defined in , or a signal number. Signal names are case insensitive and the SIG prefix is optional.

格式:trap "commands" EXIT
腳本退出時執行 commands 指定的命令。(If a sigspec is EXIT (0) the command arg is executed on exit from the shell.

格式:trap "commands" DEBUG
在腳本執行時列印調試資訊,比如列印將要執行的命令及參數清單。(If a sigspec is DEBUG, the command arg is executed before every simple command, for command, case command, select command, every arithmetic for command, and before the first command executes in a shell function (see SHELL GRAMMAR above). Refer to the description of the extdebug option to the shopt builtin for details of its effect on the DEBUG trap.

格式:trap "commands" ERR
當命令出錯,退出碼非0,執行 commands 指定的命令。(If a sigspec is ERR, the command arg is executed whenever a simple command has a non-zero exit status, subject to the following conditions. The ERR trap is not executed if the failed command is part of the command list immediately following a while or until keyword, part of the test in an if statement, part of a && or ┅Ι│ list, or if the command’s return value is being inverted via !. These are the same conditions obeyed by the errexit option.

格式:trap "commands" RETURN
當從 shell 函數返回、或者使用 source 命令執行另一個腳本檔時,執行 commands 指定的命令。(If a sigspec is RETURN, the command arg is executed each time a shell function or a script executed with the . or source builtins finishes executing. Signals ignored upon entry to the shell cannot be trapped or reset. Trapped signals that are not being ignored are reset to their original values in a child process when it is created. The return status is false if any sigspec is invalid; otherwise trap returns true.

信號說明
Linux 支援的信號清單如下。很多信號是與機器的體系結構相關的. 更多說明可以參考 man signal.
信號值 默認處理動作 發出信號的原因
SIGHUP 1 A 終端掛起或者控制進程終止
SIGINT 2 A 鍵盤中斷(如break鍵被按下)
SIGQUIT 3 C 鍵盤的退出鍵被按下
SIGILL 4 C 非法指令
SIGABRT 6 C 由abort(3)發出的退出指令
SIGFPE 8 C 浮點異常
SIGKILL 9 AEF Kill信號v
SIGSEGV 11 C 無效的內存引用
SIGPIPE 13 A 管道破裂: 寫一個沒有讀埠的管道
SIGALRM 14 A 由alarm(2)發出的信號
SIGTERM 15 A 終止信號
SIGUSR1 30,10,16 A 用戶自定義信號1
SIGUSR2 31,12,17 A 用戶自定義信號2
SIGCHLD 20,17,18 B 子進程結束信號
SIGCONT 19,18,25 進程繼續(曾被停止的進程)
SIGSTOP 17,19,23 DEF 終止進程
SIGTSTP 18,20,24 D 控制終端(tty)上按下停止鍵
SIGTTIN 21,21,26 D 後台進程企圖從控制終端讀
SIGTTOU 22,22,27 D 後台進程企圖從控制終端寫

Ps. Action 說明: A=Default action is to terminate the process; B=Default action is to ignore the signal; C=Default action is to terminate the process and dump core; D=Default action is to stop the process.


使用示例
示例一
# trap -p // Check no other trap being set
# trap "echo hello" INT
# trap -p
trap -- 'echo hello' SIGINT
# trap -p INT // Check our trap for INT being set
trap -- 'echo hello' SIGINT
# trap -p QUIT
# ^Chello // Enter Ctrl+C will trigger our trap for INT

示例二
# trap -l // Show all supported Signal
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
...

示例三 在腳本中使用
下面的腳本用於檢查和啟動 java 程式。
第7行:找出正在運行的符合指定特徵的進程;
第11行:如果找到了這樣的進程,就殺掉;
第22行:以後台方式啟動java程式;
第24行:得到剛啟動的程式的pid;
第28行:對SIGTERM信號設置處理方式:結束啟動的java程式;
第30行:等待後台進程結束。
  1. #!/bin/sh  
  2.   
  3. #2007.05.06/07  
  4. # 增加了殺掉LAST_PID功能  
  5. # 增加了腳本退出時殺掉THIS_PID功能  
  6.   
  7. LAST_PID=$(ps -ef|grep 'java.*Zhenjiang'|grep -v grep|awk '{print $2}')  
  8.   
  9. echo "LAST_PID=$LAST_PID"  
  10.   
  11. if [ -n "$LAST_PID" ] && [ "$LAST_PID" -gt 0 ]; then  
  12. echo "LAST PROCESS NOT EXIT, NOW KILL IT!"  
  13. kill $LAST_PID  
  14. sleep 1  
  15. fi  
  16.   
  17. if ! cd ../opt/zhenjiang; then  
  18. echo "CHANGE DIRECTORY FAILED"  
  19. exit 1  
  20. fi  
  21.   
  22. java -classpath .:./cpinterfaceapi.jar:./log4j-1.2.14.jar:./hyjc.jar:./smj.client.jar Zhenjiang &  
  23.   
  24. THIS_PID=$!  
  25.   
  26. echo "THIS_PID=$THIS_PID"  
  27.   
  28. trap "kill $THIS_PID" TERM  
  29.   
  30. wait  


沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!