2015-08-17 172 views
3

更多的是一個概念性問題。如果我寫一個bash腳本,做睡眠10運行時像Linux:如何殺死睡眠

control_c() 
{ 
echo goodbye 
exit #$ 
} 

trap control_c SIGINT 

while true 
do 
sleep 10 #user wants to kill process here. 
done 

控制+ C不會退出。是否因爲linux睡眠忽略了SIGINT?有沒有辦法規避這一點,並讓用戶能夠按Ctrl + C出睡眠?

+0

http://stackoverflow.com/questions/26530146/how-to-kill-a-process-in-unix-that-is-often-sleeping –

回答

0

由於睡眠不是bash函數,但外部應用程序,我想Ctrl + C被睡眠進程捕獲,通常應該終止它。
因此,對於在睡眠中執行的contorl_c函數,用戶必須按兩次Ctrl + C:1st - 退出睡眠,2nd被bash陷阱捕獲。

2

當睡眠10運行時,control + c將不會退出。

這是不正確的。即使睡眠正在運行,control + c也會退出。

你確定你的腳本在bash中執行嗎?您應該在第一行中明確添加「#!/ bin/bash」。

+0

當我在我的系統上運行腳本(後添加'#!/ bin/bash'),在'sleep 10'結束之前輸入Ctrl-C會導致腳本在打印'goodbye'後終止。 –

7

您所描述的內容與中斷信號一致僅適用於您的bash腳本,而不是過程組。您的腳本獲取信號,但sleep不會,因此只有在sleep完成後,您的陷阱才能執行。標準技巧是在後臺運行sleep並在其上運行wait,以便wait接收中斷信號。您也應該明確地發送SIGINT到任何仍在運行的子進程,以確保它們退出。

control_c() 
{ 
echo goodbye 
kill -SIGINT $(jobs -p) 
exit #$ 
} 

trap control_c SIGINT 

while true 
do 
sleep 10 & 
wait 
done