更多的是一個概念性問題。如果我寫一個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出睡眠?
更多的是一個概念性問題。如果我寫一個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出睡眠?
由於睡眠不是bash函數,但外部應用程序,我想Ctrl + C被睡眠進程捕獲,通常應該終止它。
因此,對於在睡眠中執行的contorl_c函數,用戶必須按兩次Ctrl + C:1st - 退出睡眠,2nd被bash陷阱捕獲。
當睡眠10運行時,control + c將不會退出。
這是不正確的。即使睡眠正在運行,control + c也會退出。
你確定你的腳本在bash中執行嗎?您應該在第一行中明確添加「#!/ bin/bash」。
當我在我的系統上運行腳本(後添加'#!/ bin/bash'),在'sleep 10'結束之前輸入Ctrl-C會導致腳本在打印'goodbye'後終止。 –
您所描述的內容與中斷信號一致僅適用於您的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
http://stackoverflow.com/questions/26530146/how-to-kill-a-process-in-unix-that-is-often-sleeping –