我使用過的Linux命令之trap - 在指令碼中處理訊號
用途說明
trap是一個shell內建命令,它用來在指令碼中指定訊號如何處理。比如,按Ctrl+C會使指令碼終止執行,實際上系統傳送了SIGINT訊號給指令碼程式,SIGINT訊號的預設處理方式就是退出程式。如果要在Ctrl+C不退出程式,那麼就得使用trap命令來指定一下SIGINT的處理方式了。trap命令不僅僅處理Linux訊號,還能對指令碼退出(EXIT)、除錯(DEBUG)、錯誤(ERR)、返回(RETURN)等情況指定處理方式。
常用引數
trap [-lp] [[arg] sigspec ...]
格式:trap "commands" signals
當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 <signal.h>, 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.)
使用示例
示例一
[root@new55 ~]# trap -p
[root@new55 ~]# trap "echo hello" INT
[root@new55 ~]# trap -p
trap -- 'echo hello' SIGINT
[root@new55 ~]# trap -p INT
trap -- 'echo hello' SIGINT
[root@new55 ~]# trap -p QUIT
[root@new55 ~]# Ctrl+C
[root@new55 ~]# hello
[root@new55 ~]#
示例二
[root@new55 ~]# trap -l
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 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
[root@new55 ~]#
示例三 在指令碼中使用
下面的指令碼用於檢查和啟動java程式。
第7行:找出正在執行的符合指定特徵的程式;
第11行:如果找到了這樣的程式,就殺掉;
第22行:以後臺方式啟動java程式;
第24行:得到剛啟動的程式的pid;
第28行:對SIGTERM訊號設定處理方式:結束啟動的java程式;
第30行:等待後臺程式結束。
- #!/bin/sh
- #2007.05.06/07
- # 增加了殺掉LAST_PID功能
- # 增加了指令碼退出時殺掉THIS_PID功能
- LAST_PID=$(ps -ef|grep 'java.*Zhenjiang'|grep -v grep|awk '{print $2}')
- echo "LAST_PID=$LAST_PID"
- if [ -n "$LAST_PID" ] && [ "$LAST_PID" -gt 0 ]; then
- echo "LAST PROCESS NOT EXIT, NOW KILL IT!"
- kill $LAST_PID
- sleep 1
- fi
- if ! cd ../opt/zhenjiang; then
- echo "CHANGE DIRECTORY FAILED"
- exit 1
- fi
- java -classpath .:./cpinterfaceapi.jar:./log4j-1.2.14.jar:./hyjc.jar:./smj.client.jar Zhenjiang &
- THIS_PID=$!
- echo "THIS_PID=$THIS_PID"
- trap "kill $THIS_PID" TERM
- wait
相關文章
- linux系統指令碼中trap訊號都有哪些?Linux運維Linux指令碼運維
- shell訊號捕捉命令 trap
- 使用命令trap來捕捉訊號(轉)
- linux中的訊號處理與SROPLinux
- Linux Shell的訊號trap功能細節Linux
- Linux 使用 shell 指令碼處理字串Linux指令碼字串
- linux 訊號與處理Linux
- Linux系統程式設計之訊號中斷處理(下)Linux程式設計
- Linux系統程式設計之訊號中斷處理(上)Linux程式設計
- Linux訊號機制與訊號處理Linux
- 處理python中的訊號Python
- Linux SIGCHLD訊號處理LinuxGC
- Linux訊號處理機制Linux
- 在shell中捕捉訊號的命令(轉)
- 我在linux 中使用rman 備份指令碼Linux指令碼
- Python 處理指令碼的命令列引數(二):使用clickPython指令碼命令列
- Python 處理指令碼的命令列引數(三):使用argparsePython指令碼命令列
- 科學和工程中的訊號處理
- Bash 指令碼中的錯誤處理指令碼
- 使用awk批處理在字串中增加特殊符號字串符號
- ftp命令在指令碼中的運用FTP指令碼
- Sidekiq 訊號處理原始碼分析IDE原始碼
- Bash 指令碼如何建立臨時檔案:mktemp 命令和 trap 命令教程指令碼
- linux系統程式設計之訊號(七):被訊號中斷的系統呼叫和庫函式處理方式Linux程式設計函式
- Linux學習之檔案處理命令(二)目錄處理命令 && 檔案處理命令Linux
- 【原始碼】Redis命令處理過程原始碼Redis
- Windows登錄檔中修改UAC(使用者賬號控制)及批處理指令碼Windows指令碼
- 開心檔之C++ 訊號處理C++
- DOM在Ahooks中的處理過程Hook
- 使用批處理指令碼或SHELL配合SQL指令碼指令碼SQL
- 語音訊號處理入門系列(2)——訊號處理中的幾個關鍵概念音訊
- 我使用過的Linux命令之sftp - 安全檔案傳輸命令列工具LinuxFTP命令列
- 關於Linux Shell的訊號trap功能你必須知道的細節Linux
- 單引號在動態SQL中的處理SQL
- Shell指令碼中cd命令使用指令碼
- 幾個Linux命令及指令碼使用中的奇淫巧技Linux指令碼
- Linux 訊號signal處理函式--轉Linux函式
- xenomai核心解析之訊號signal(二)---xenomai訊號處理機制AI