2013-01-07 52 views
8

我的樣本文件陷阱/殺死如何在Linux上的bash中工作?

traptest.sh:

#!/bin/bash 
trap 'echo trapped' TERM 
while : 
do 
    sleep 1000 
done 

$ traptest.sh &

[1] 4280

$殺死%1 < - 千里L請工作作品數量

終止

被困

$ traptest.sh &

[1] 4280

$ kill 4280 < - 通過進程ID殺死不起作用?

(蟋蟀的聲音,進程沒有中止)

如果我完全刪除陷阱聲明,殺進程ID再次作品?

在工作時運行一些RHEL 2.6.18-194.11.4.el5。我很困惑這種行爲,是嗎?

+0

這是超級怪異的。我試圖調查,但我無法找到任何合乎邏輯的事情。 +1這個問題 –

+0

是的,但睡眠開始它自己的過程,這是你需要殺死的。有一件奇怪的事情是殺死%1立即殺死它,但是殺死需要你在死亡之前首先fg。 –

回答

4
kill [pid] 

採取專門發送TERM信號到指定的PID。

kill %1 

將TERM信號發送到作業#1的整個過程組,在這種情況下發送到腳本pid +他的孩子(睡眠)。

我驗證過與睡眠進程和腳本進程

反正strace的,有人得到了類似的問題在這裏(但SIGINT而不是SIGTERM):http://www.vidarholen.net/contents/blog/?p=34

引用最重要的一句話:

殺-INT%1將信號發送給作業的進程組,而不是轉到後臺PID!

+0

非常感謝您的幫助 –

+0

因此,它以投票的方式使用kill?多少輪詢足夠了?大聲笑 –

6

這是預期的行爲。 kill發送的默認信號是SIGTERM,您正在捕捉您的陷阱。考慮到這一點:

#!/bin/bash 
# traptest.sh 

trap "echo Booh!" SIGINT SIGTERM 
echo "pid is $$" 

while :     # This is the same as "while true". 
do 
    a=1 
done 

(睡眠真的創造了一個新的過程,我認爲我的例子更清晰)。

所以,如果你從另一個終端一個終端和kill TRAPTEST_PROCESS_ID運行traptest.sh,在終端運行traptest輸出將Booh!預期(和進程將被殺死)。如果您嘗試發送kill -s HUP TRAPTEST_PROCESS_ID,它將終止traptest過程。

This應該清除%1混淆。

注意:該代碼的例子是從tldp

+0

謝謝,我會編輯我的問題 - 一段更清晰。我認爲kill是在做一個SIGTERM,但是似乎在陷阱中添加了SIGINT允許kill process-id被處理。 –

+0

我相信並非如此。無論您是否捕獲SIGINT,都不會影響SIGTERM的處理方式。你是否嘗試了我在答案中描述的場景?我的意思是用不同的信號殺死這個過程,看看發生了什麼? – davak

+0

同時使用Davide的答案 - 如果我只是捕獲SIGTERM,並在while循環中放置「sleep 10s」,那麼腳本確實會處理陷阱 - 但僅在睡眠退出後。 Bash不處理信號,直到子進程返回。如果我只有while循環,它會立即處理。你的回答是建設性的,通過試驗去除兒童睡眠過程來幫助我理解問題。非常感謝 –