linux捕捉信号sigint失败,为shell布置陷阱:trap捕捉信号方法论
本文目錄:
1.1 信號(hào)說(shuō)明
1.2 trap布置陷阱
1.3 布置完美陷阱必備知識(shí)
家里有老鼠,快消滅它!哎,又給跑了。老鼠這小東西跑那么快,想直接直接消滅它還真不那么容易。于是,老鼠藥、老鼠夾子或老鼠籠就派上用場(chǎng)了,它們都是陷阱,放在那靜靜地等待著老鼠的光顧。
在shell中,也可以捉"老鼠",捉到"老鼠"后,可以無(wú)視它、殺死它或者抓起來(lái)逗一番。只需使用內(nèi)置命令trap(中文就翻譯為陷阱、圈套)就可以布置一個(gè)陷阱,這個(gè)陷阱當(dāng)然不是捕老鼠的,而是捕捉信號(hào)。
通常trap都在腳本中使用,主要有2種功能:
(1).忽略信號(hào)。當(dāng)運(yùn)行中的腳本進(jìn)程接收到某信號(hào)時(shí)(例如誤按了CTRL+C),可以將其忽略,免得腳本執(zhí)行到一半就被終止。
(2).捕捉到信號(hào)后做相應(yīng)處理。主要是清理一些腳本創(chuàng)建的臨時(shí)文件,然后退出。
1.1 信號(hào)說(shuō)明
詳細(xì)的信號(hào)說(shuō)明見(jiàn):信號(hào)。常見(jiàn)的信號(hào)以及它們的數(shù)值代號(hào)、說(shuō)明如下:
Signal Value Comment
─────────────────────────────
SIGHUP1終止進(jìn)程,特別是終端退出時(shí),此終端內(nèi)的進(jìn)程都將被終止
SIGINT2 中斷進(jìn)程,幾乎等同于sigterm,會(huì)盡可能的釋放執(zhí)行clean-up,釋放資源,保存狀態(tài)等(CTRL+C)
SIGQUIT3從鍵盤發(fā)出殺死(終止)進(jìn)程的信號(hào)
SIGKILL9 強(qiáng)制殺死進(jìn)程,該信號(hào)不可被捕捉和忽略,進(jìn)程收到該信號(hào)后不會(huì)執(zhí)行任何clean-up行為,所以資源不會(huì)釋放,狀態(tài)不會(huì)保存
SIGTERM15 殺死(終止)進(jìn)程,幾乎等同于sigint信號(hào),會(huì)盡可能的釋放執(zhí)行clean-up,釋放資源,保存狀態(tài)等
SIGSTOP19該信號(hào)是不可被捕捉和忽略的進(jìn)程停止信息,收到信號(hào)后會(huì)進(jìn)入stopped狀態(tài)
SIGTSTP20 該信號(hào)是可被忽略的進(jìn)程停止信號(hào)(CTRL+Z)
每個(gè)信號(hào)其真實(shí)名稱并非是SIGXXX,而是去除SIG后的單詞,每個(gè)信號(hào)還有其對(duì)應(yīng)的數(shù)值代號(hào),在使用信號(hào)時(shí),可以使用這3種方式中的任一一種。例如SIGHUP,它的信號(hào)名稱為HUP,數(shù)值代號(hào)為1,發(fā)送HUP信號(hào)時(shí),以下3種方式均可。
kill -1PIDkill -HUP PIDkill -SIGHUP PID
在上面所列的信號(hào)列表中,KILL和STOP這兩個(gè)信號(hào)無(wú)法被捕捉。一般來(lái)說(shuō),在設(shè)置信號(hào)陷阱時(shí),只會(huì)考慮HUP、INT、QUIT、TERM這4個(gè)會(huì)終止、中斷進(jìn)程的信號(hào)。
1.2 trap布置陷阱
trap的語(yǔ)法格式為:
1. trap [-lp]2. trap cmd-body signal_list3. trap ''signal_list4. trap signal_list5. trap -signale_list
語(yǔ)法說(shuō)明:
語(yǔ)法1:-l選項(xiàng)用于列出當(dāng)前系統(tǒng)支持的信號(hào)列表,和"kill -l"一樣的作用。-p選項(xiàng)用于列出當(dāng)前shell環(huán)境下已經(jīng)布置好的陷阱。
語(yǔ)法2:當(dāng)捕捉到給定的信號(hào)列表中的某個(gè)信號(hào)時(shí),就執(zhí)行此處給定cmd-body中的命令。
語(yǔ)法3:命令參數(shù)為空字符串,這時(shí)shell進(jìn)程和shell進(jìn)程內(nèi)的子進(jìn)程都會(huì)忽略信號(hào)列表中的信號(hào)。
語(yǔ)法4:省略命令參數(shù),重置陷阱為啟動(dòng)shell時(shí)的陷阱。不建議此語(yǔ)法,當(dāng)給定多個(gè)信號(hào)時(shí)結(jié)果會(huì)出人意料。
語(yǔ)法5:等價(jià)于語(yǔ)法4。
trap不接任何參數(shù)和選項(xiàng)時(shí),默認(rèn)為"-p"。
(1).查看當(dāng)前shell已布置的陷阱。
[root@linuxidc ~]# trap
trap-- ''SIGTSTP
trap-- ''SIGTTIN
trap-- '' SIGTTOU
這3個(gè)陷阱都是信號(hào)忽略陷阱,當(dāng)捕獲到TSTP、TTIN或TTOU信號(hào)時(shí),將不做任何處理。
(2).設(shè)置一個(gè)可以忽略CTRL+C和15信號(hào)的陷阱。
[root@linuxidc ~]# trap ''SIGINT SIGTERM
[root@linuxidc~]# trap
trap-- ''SIGINT
trap-- ''SIGTERM
trap-- ''SIGTSTP
trap-- ''SIGTTIN
trap-- '' SIGTTOU
這樣一來(lái),當(dāng)前的shell就無(wú)法被kill -15殺死。
[root@linuxidc ~]# kill $BASHPID;echo killcurrent bash failedkill current bash failed
(3).設(shè)置一個(gè)陷阱,當(dāng)這個(gè)陷阱捕捉到15信號(hào)時(shí),就打印一條消息。
[root@linuxidc ~]# trap 'echo caught the TERM signal'TERM
[root@linuxidc~]# kill$BASHPID
caught the TERM signal
再查看已設(shè)置的陷阱,之前設(shè)置為忽略TERM信號(hào)的陷阱已經(jīng)被覆蓋。
[root@linuxidc ~]# trap
trap-- ''SIGINT
trap-- 'echo caught the TERM signal'SIGTERM
trap-- ''SIGTSTP
trap-- ''SIGTTIN
trap-- '' SIGTTOU
(4).重置針對(duì)INT和TERM這兩個(gè)信號(hào)的陷阱為初始狀態(tài)。
[root@linuxidc ~]# trap -SIGINT SIGTERM
[root@linuxidc~]# trap
trap-- ''SIGTSTP
trap-- ''SIGTTIN
trap-- '' SIGTTOU
(5).在腳本中設(shè)置一個(gè)能忽略CTRL+C和SIGTERM信號(hào)的陷阱。
[root@linuxidc ~]# cat trap1.sh#!/bin/bash
# script_name: trap1.sh#
trap''SIGINT SIGTERMsleep 10
echo sleep success
當(dāng)執(zhí)行該腳本后,將首先陷入睡眠狀態(tài),按下CTRL+C將無(wú)效。仍會(huì)執(zhí)行完所有的命令。
[root@linuxidc ~]# ./trap1.sh
^C^C^C^Csleep success
(6).布置一個(gè)當(dāng)腳本中斷時(shí)能清理垃圾并退出立即腳本的陷阱。
[root@linuxidc ~]# cat trap1.sh#!/bin/bash
# script_name: trap1.sh#
trap'echo trap handling...;rm -rf /tmp/$BASHPID$BASHPID;echo TEMP file cleaned;exit'SIGINT SIGTERM SIGQUIT SIGHUPmkdir -p /tmp/$BASHPID$BASHPID/
touch /tmp/$BASHPID$BASHPID/{a.txt,a.log}sleep 10
echo first sleepsuccesssleep 10
echo second sleep success
這樣,無(wú)論是什么情況中斷(除非是SIGKILL),腳本總能清理掉臨時(shí)垃圾。
1.3 布置完美陷阱必備知識(shí)
(1).陷阱的守護(hù)對(duì)象是shell進(jìn)程本身,不會(huì)守護(hù)shell環(huán)境內(nèi)的子進(jìn)程。但如果是信號(hào)忽略型陷阱,則會(huì)守護(hù)整個(gè)shell進(jìn)程組使其忽略給定信號(hào)。
以下面這個(gè)腳本為例,設(shè)置的陷阱會(huì)捕捉到SIGING和SIGTERM兩個(gè)信號(hào),捕捉到信號(hào)時(shí)將輸出陷阱做出處理的時(shí)間點(diǎn)。
[root@linuxidc ~]# cat trap2.sh#!/bin/bash
# script_name: trap2.sh#
trap'echo trap_handle_time: $(date +"%F %T")'SIGINT SIGTERMecho time_start: $(date +"%F %T")sleep 10
echo time_end1: $(date +"%F %T")sleep 10
echo time_end2: $(date +"%F %T")
執(zhí)行該腳本,并另開(kāi)一個(gè)會(huì)話窗口,殺死trap2.sh腳本。
[root@linuxidc ~]# ./trap2.sh[root@linuxidc~]# killall -s SIGTERM trap2.sh
執(zhí)行結(jié)果如下。
time_start: 2017-08-14 12:59:23trap_handle_time:2017-08-1412:59:33time_end1:2017-08-14 12:59:33time_end2:2017-08-14 12:59:43
結(jié)果中的trap_handle_time證明,腳本所在shell進(jìn)程收到SIGTERM信號(hào)后,trap成功進(jìn)行了處理。如果細(xì)心的話,會(huì)發(fā)現(xiàn)trap處理的時(shí)間正好是10秒之后,這并不是因?yàn)檎?0秒之后才發(fā)送SIGTERM信號(hào),而是因?yàn)閠rap就是這么工作的,這是另一個(gè)需要注意的點(diǎn),稍后見(jiàn)下文的(2)。
再次執(zhí)行腳本,在另個(gè)會(huì)話窗口下殺死腳本中正在運(yùn)行的sleep進(jìn)程和trap2.sh腳本所在進(jìn)程。
[root@linuxidc ~]# ./trap2.sh[root@linuxidc~]# killall -s SIGTERM sleep ;sleep 3; killall -s SIGINT trap2.sh # 另一個(gè)會(huì)話終端下執(zhí)行此命令
最終將返回如下結(jié)果:
time_start: 2017-08-14 12:23:06Terminated # 接收到對(duì)sleep發(fā)送的SIGTERM信號(hào)
time_end1:2017-08-14 12:23:09# 沒(méi)有trap_handle_time,陷阱沒(méi)有守護(hù)sleep進(jìn)程
trap_handle_time:2017-08-14 12:23:19# shell進(jìn)程本身收到了SIGINT信號(hào),并被陷阱處理了
time_end2:2017-08-14 12:23:19
結(jié)果說(shuō)明腳本中的trap陷阱沒(méi)有守護(hù)shell內(nèi)的sleep進(jìn)程,只守護(hù)了shell本身。同樣也發(fā)現(xiàn)了,雖然是在3秒后發(fā)送INT信號(hào)給腳本進(jìn)程,但陷阱同樣是在10秒之后才開(kāi)始處理的。
再修改腳本中的陷阱為信號(hào)忽略陷阱。
[root@linuxidc ~]# cat ./trap3.sh#!/bin/bash
# script_name: trap3.sh#
trap''SIGINT SIGTERMecho time_start: $(date +"%F %T")sleep 10
echo time_end1: $(date +"%F %T")sleep 10
echo time_end2: $(date +"%F %T")
執(zhí)行trap3.sh,并在另一個(gè)會(huì)話終端下殺死sleep進(jìn)程。
[root@linuxidc ~]# ./trap3.sh[root@linuxidc~]# killall -s SIGTERM sleep;sleep 3;killall -s SIGINT sleep # 另一個(gè)會(huì)話終端下執(zhí)行此命令
結(jié)果如下。從時(shí)間差可以看出,無(wú)論是SIGTERM還是SIGINT信號(hào),sleep進(jìn)程都被忽略型trap守護(hù)了。
time_start: 2017-08-14 12:31:54time_end1:2017-08-14 12:32:04time_end2:2017-08-14 12:32:14
(2).如果shell中針對(duì)某信號(hào)設(shè)置了陷阱,則該shell進(jìn)程接收到該信號(hào)時(shí),會(huì)等待其內(nèi)正在運(yùn)行的命令結(jié)束才開(kāi)始處理陷阱。
其實(shí)(1)中的幾個(gè)示例的結(jié)果已經(jīng)證明了這一點(diǎn)。只要是向shell進(jìn)程發(fā)送的信號(hào),都會(huì)等待當(dāng)前正在運(yùn)行的命令結(jié)束后才處理信號(hào),然后繼續(xù)腳本向下運(yùn)行。
(3).CTRL+C和SIGINT不是等價(jià)的。當(dāng)某一時(shí)刻按下CTRL+C,它是在向整個(gè)當(dāng)前運(yùn)行的進(jìn)程組發(fā)送SIGINT信號(hào)。對(duì)shell腳本來(lái)說(shuō),SIGINT不僅發(fā)送給shell腳本進(jìn)程,還發(fā)送給腳本中當(dāng)前正在運(yùn)行的進(jìn)程。
所以,如果shell中設(shè)置SIGINT陷阱,不僅會(huì)終止腳本中當(dāng)前正在運(yùn)行的進(jìn)程,trap還會(huì)立即進(jìn)行對(duì)應(yīng)的處理。
以下面的腳本trap4.sh為例。
[root@linuxidc ~]# cat trap4.sh#!/bin/bash
# script_name: trap4.sh#
trap'echo trap_handle_time: $(date +"%F %T")'SIGINTecho time_start: $(date +"%F %T")sleep 10
echo time_end1: $(date +"%F %T")sleep 10
echo time_end2: $(date +"%F %T")
如果使用kill命令向trap4.sh發(fā)送信號(hào),正常情況下trap會(huì)在當(dāng)前運(yùn)行的sleep進(jìn)程完成后才進(jìn)行相關(guān)處理。但如果是按下CTRL+C,先看結(jié)果。
[root@linuxidc ~]# ./trap4.shtime_start:2017-08-14 13:41:30
^Ctrap_handle_time: 2017-08-14 13:41:31time_end1:2017-08-14 13:41:31
^Ctrap_handle_time: 2017-08-14 13:41:32time_end2:2017-08-14 13:41:32
結(jié)果中顯示,兩次按下CTRL+C后,不僅sleep立刻結(jié)束了,trap也立即進(jìn)行處理了。這說(shuō)明CTRL+C不僅讓腳本進(jìn)程收到了SIGINT信號(hào),也讓當(dāng)前正在運(yùn)行的進(jìn)程收到了SIGINT信號(hào)。
需要特別說(shuō)明的是,如果當(dāng)前正在運(yùn)行的進(jìn)程處在循環(huán)內(nèi),當(dāng)該進(jìn)程收到了終止進(jìn)程后,僅僅只是立即終止當(dāng)次進(jìn)程,而不會(huì)終止整個(gè)循環(huán),也就是說(shuō),它還會(huì)繼續(xù)向下執(zhí)行后續(xù)命令并進(jìn)入下一個(gè)循環(huán)。如果此時(shí)是使用CTRL+C發(fā)送SIGINT,則每次CTRL+C時(shí),trap也會(huì)一次次進(jìn)行處理。
注意點(diǎn)(1)(2)(3)很重要,因?yàn)楦闱宄怂鼈?#xff0c;才能明白腳本中當(dāng)前正在運(yùn)行的進(jìn)程是先完成還是立即結(jié)束,這在寫復(fù)雜腳本或任務(wù)型腳本極其重要。例如大量文檔中www.example.com需要替換成www.example.net,假如使用sed進(jìn)行處理,我們肯定不希望替換了一部分文件的時(shí)候被臨時(shí)終止。
(4).每個(gè)陷阱都有守護(hù)范圍。每一個(gè)陷阱只將守護(hù)它后面的所有進(jìn)程,直到遇到下一個(gè)相同信號(hào)的陷阱。
以shell腳本為例,如下圖所示。
(5).當(dāng)shell環(huán)境下設(shè)置了信號(hào)忽略陷阱時(shí),子shell在啟動(dòng)時(shí)將繼承該陷阱,且這些信號(hào)忽略陷阱不可再改變或重置。信號(hào)忽略陷阱是子shell唯一繼承的陷阱類型。
先在當(dāng)前shell環(huán)境下設(shè)置一個(gè)忽略SIGINT的陷阱,和一個(gè)不忽略SIGTERM的陷阱。
[root@linuxidc ~]# trap ''SIGINT
[root@linuxidc~]# trap 'echo haha' SIGTERM
以下是測(cè)試腳本。腳本中首先輸出腳本剛啟動(dòng)時(shí)的最初陷阱列表,隨后修改陷阱并輸出新的陷阱列表,最后重置陷阱并輸出重置后的陷阱列表。
[root@linuxidc ~]# cat trap6.sh#!/bin/bash
# script_name: trap6.sh
echo old_trap:--------trap-p
trap'echo haha'SIGINT SIGTERMecho new_trap:--------trap-pecho "reset trap:------"trap-SIGINT SIGTERM
trap-p
執(zhí)行結(jié)果如下。
[root@linuxidc ~]# ./trap6.shold_trap:--------trap-- ''SIGINT
new_trap:--------trap-- ''SIGINT
trap-- 'echo haha'SIGTERM
reset trap:------trap-- '' SIGINT
從結(jié)果中可以看出,啟動(dòng)腳本時(shí),父shell中忽略SIGINT的陷阱被繼承了,但不忽略信號(hào)的陷阱未被繼承。而且腳本繼承的信號(hào)忽略陷阱無(wú)法被修改和重置。
(6).交互式的shell下,如果沒(méi)有定義任何SIGTERM信號(hào)的陷阱,則會(huì)忽略該信號(hào)。
所以,在默認(rèn)(未定義SIGTERM陷阱)時(shí),無(wú)法直接通過(guò)15信號(hào)殺死當(dāng)前bash進(jìn)程。
[root@linuxidc ~]# kill $BASHPID;echo passed;kill -9$BASHPID
passed
# 此處當(dāng)前bash已被kill-9強(qiáng)制殺死
(7).除了kill -l或trap -l列出的信號(hào)列表,trap還有4種特殊的信號(hào):EXIT(或信號(hào)代碼0)、ERR、DEBUG和RETURN。DEBUG和RETURN這兩種信號(hào)陷阱無(wú)需關(guān)注。
EXIT信號(hào)也是0信號(hào),當(dāng)設(shè)置了EXIT陷阱時(shí),每次exit的時(shí)候都會(huì)被捕捉,并做相關(guān)處理。
ERR陷阱是在設(shè)置了"set -e"時(shí)生效的,當(dāng)設(shè)置了"set -e"選項(xiàng),每次遇到非0退出狀態(tài)碼時(shí)會(huì)退出當(dāng)前shell,如果寫在腳本中,就是退出腳本。有了它就不用再在腳本中書(shū)寫對(duì)"$?"是否(不)等于0的判斷語(yǔ)句,不過(guò)它主要用于避免腳本中產(chǎn)生錯(cuò)誤時(shí),錯(cuò)誤被滾雪球式的不斷放大。很多人將這一設(shè)置當(dāng)作寫shell腳本的一項(xiàng)行為規(guī)范,但我個(gè)人不完全認(rèn)同,很多時(shí)候非0退出狀態(tài)碼是無(wú)關(guān)緊要的,甚至有時(shí)候非0狀態(tài)碼才是繼續(xù)執(zhí)行的必要條件。
回到話題上。先看看"set -e"的效果。以下面的腳本為例,在腳本中,mv命令少給了一個(gè)參數(shù),它是錯(cuò)誤命令,返回的是非0狀態(tài)碼。
[root@linuxidc ~]# vim trap8.sh#!/bin/bash
set-eecho "right here"
mv ~/a.txt
["$?" -eq 0 ] && echo "right again" || echo "wrong here"
如果不設(shè)置"set -e",那么會(huì)被下一條語(yǔ)句判斷,但因?yàn)樵O(shè)置了"set -e",使得在mv錯(cuò)誤發(fā)生時(shí),就立即退出腳本所在的shell。也就是說(shuō),對(duì)"$?"的判斷語(yǔ)句根本就是多余的。結(jié)果如下。
[root@linuxidc ~]# ./trap8.shright heremv: missing destination file operand after ‘/root/a.txt’
Try'mv --help' for more information.
可以設(shè)置ERR陷阱,專門捕獲"set -e"起作用時(shí)的信號(hào)。例如,當(dāng)命令錯(cuò)誤時(shí),做一些臨時(shí)文件清理動(dòng)作等。注意,當(dāng)捕獲到了ERR信號(hào)時(shí),腳本不會(huì)再繼續(xù)向下運(yùn)行,而是trap處理結(jié)束后就立即退出。例如:
[root@linuxidc ~]# vim trap8.sh#!/bin/bash
set-e
trap'echo continue'ERRecho "right here"
mv ~/a.txt
["$?" -eq 0 ] && echo "right again" || echo "wrong here"
echo haha
執(zhí)行結(jié)果如下:
[root@linuxidc ~]# ./trap8.shright heremv: missing destination file operand after ‘/root/a.txt’
Try'mv --help' for moreinformation.
continue
(8).在trap中兩個(gè)很好用的變量:BASH_COMMAND和LINENO。BASH_COMMAND變量記錄的是當(dāng)前正在執(zhí)行的命令行,如果是用在陷阱中,則記錄的是陷阱觸發(fā)時(shí)正在運(yùn)行的命令行。LINENO記錄的是正在執(zhí)行的命令所處行號(hào)。
例如:
[root@linuxidc ~]# vim trap8.sh#!/bin/bash
set-e
trap'echo "error line: $LINENO,error cmd: $BASH_COMMAND"'ERRecho "right here"
mv ~/a.txt
執(zhí)行結(jié)果。
[root@linuxidc ~]# ./trap8.shright heremv: missing destination file operand after ‘/root/a.txt’
Try'mv --help' for moreinformation.
error line:5,error cmd: mv ~/a.txt
(9).處理腳本中啟動(dòng)的后臺(tái)進(jìn)程。
通常trap在腳本中的作用之一是在突然被中斷時(shí)清理一些臨時(shí)文件然后退出,雖然它會(huì)等待腳本中當(dāng)前正在運(yùn)行的命令結(jié)束,然后清理并退出。但是,很多時(shí)候會(huì)在腳本中使用后臺(tái)進(jìn)程,以加快腳本的速度。而后臺(tái)進(jìn)程是獨(dú)立掛靠在init/systemd下的,所以它不受終端以及shell環(huán)境的影響。換句話說(shuō),當(dāng)腳本突然被中斷時(shí),即使陷阱捕獲到了該信號(hào),并清理了臨時(shí)文件后退出,但是那些腳本中啟動(dòng)的后臺(tái)進(jìn)程還會(huì)繼續(xù)運(yùn)行。
這就給腳本帶來(lái)了一些不可預(yù)測(cè)性,一個(gè)健壯的腳本必須能夠正確處理這種情況。trap可以實(shí)現(xiàn)比較好的解決這種問(wèn)題,方法是在trap的命令行中加上向后臺(tái)進(jìn)程發(fā)送信號(hào)的語(yǔ)句,然后再退出。
以下面的腳本為例。
[root@linuxidc ~]# vim trap10.sh#!/bin/bash
trap'echo first trap $(date +"%F %T");exit'SIGTERMecho first sleep $(date +"%F %T")sleep 20 &
echo second sleep $(date +"%F %T")sleep 5
該腳本中首先將一個(gè)sleep放入后臺(tái)運(yùn)行。正常情況下,該腳本執(zhí)行5秒后就會(huì)退出,但在20秒后后臺(tái)進(jìn)程sleep才會(huì)結(jié)束,即使突然發(fā)送中斷信號(hào)TERM觸發(fā)trap也一樣。
于是現(xiàn)在的目標(biāo)是,在sleep 5的過(guò)程中突然中斷腳本時(shí),能殺死后臺(tái)sleep進(jìn)程。可以使用"!"這個(gè)特殊變量。修改后的腳本如下。
[root@linuxidc ~]# vim trap10.sh#!/bin/bash
trap'echo first trap $(date +"%F %T");kill $pid;exit'SIGTERMecho first sleep $(date +"%F %T")sleep 20 &pid="$!"
sleep 30 &pid="$! $pid"
echo second sleep $(date +"%F %T")sleep 5
執(zhí)行該腳本,并在另一個(gè)會(huì)話窗口發(fā)送SIGTERM信號(hào)給該腳本進(jìn)程。
[root@linuxidc ~]# ./trap10.sh ; ps aux | grep sleep[root@linuxidc~]# kill trap10.sh # 另一個(gè)會(huì)話窗口執(zhí)行
執(zhí)行結(jié)果如下。可見(jiàn)sleep被正常終止。
first sleep 2017-08-14 21:29:19secondsleep 2017-08-14 21:29:19first trap2017-08-14 21:29:24root69096 0.0 0.0 112644 952 pts/0 S+ 21:29 0:00 grep --color=auto sleep
總結(jié)
以上是生活随笔為你收集整理的linux捕捉信号sigint失败,为shell布置陷阱:trap捕捉信号方法论的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Replace Parameter wi
- 下一篇: web.config 指定的默认页失效