我正在運行一個shell腳本,類似於bash中的sh script.sh
。該腳本包含很多行,其中一些需要幾秒鐘的時間,另外一些則需要幾天才能執行。我怎樣才能殺死sh
命令,但不殺死當前正在運行的命令(腳本中的當前行)?如何在不殺死當前執行的行的情況下殺死shell腳本
回答
我假設你有你的腳本運行天,然後你不只是要殺死它不知道,如果它的一個子完成。
使用ps
找到進程的pid。
然後
child=$(pgrep -P $pid)
while kill -s 0 $child
do
sleep 1
done
kill $pid
是的 - 這正是我所需要的。非常感謝! –
這裏有一個巨大的機會窗口,讓父進程在測試任何孩子和殺死父母之間產生另一個子進程。 –
是的,並且當新的孩子被創建時,while循環存在並且父母被殺死,這被理解爲意圖 –
你還沒有詳細說明當你'殺了'你的腳本時會發生什麼,但是我假設你希望當前正在執行的行完成,然後在做任何更多的工作之前退出。
這可能是最好的實現,只有通過編寫你的腳本的行爲方式來接收這樣的kill命令並以適當的方式進行響應 - 我不認爲在linux中這樣做有什麼魔力。
例如:
- 您可以捕獲信號,然後設置一個變量
- 檢查文件的存在(如
touch /var/tmp/trigger
)
然後在腳本中每行之後,您需要檢查每個陷阱是否已被調用(或您的觸發器文件已創建) - 然後退出。如果沒有設置觸發器,則繼續進行下一項工作。
就我所知,您無法捕獲SIGKILL
(-9) - 如果有人將其發送給您的流程,那麼它將會死亡。
HTH,王牌
我能想到實現這一目標的唯一方法是捕獲父進程的終止信號,設置一個標誌,然後在你的腳本執行另一個命令之前反覆檢查此標誌。
但子進程也需要對kill信號免疫。然而bash似乎以這種方式表現出不同於ksh的效果,並且下面似乎工作正常。
#!/bin/bash
QUIT=0
trap "QUIT=1;echo 'term'" TERM
function terminated {
if ((QUIT==1))
then
echo "Terminated"
exit
fi
}
function subprocess {
typeset -i N
while ((N++<3))
do
echo $N
sleep 1
done
}
while true
do
subprocess
terminated
sleep 3
done
- 1. 如何在不殺死InputStream的情況下殺死或暫停進程?
- 2. Bash變量殺死腳本執行
- 3. 如何在不殺死程序執行的情況下創建無限循環?
- 4. 如何殺死bash腳本
- 5. 如何在殺死一個php腳本時殺死passthru進程?
- 6. `exec`殺死腳本
- 7. 如何在死屏幕會話中殺死運行腳本
- 8. 如何在不重新啓動zeo的情況下殺死zeopack?
- 9. 如何在不回滾的情況下殺死SQL進程
- 10. 如何在不殺死孩子的情況下超時waitpid?
- 11. 當HTTP連接死亡時,apache執行的PHP腳本是否被殺死?
- 12. Shell腳本無法殺死進程
- 13. 殺死進程SHELL
- 14. 在C模式下殺死當前塊
- 15. 如何在不殺死shell的情況下退出cf ssh會話?
- 16. 如果我殺死運行java的腳本運行腳本?
- 17. Emacs:殺死運行python腳本
- 18. 如何在不殺死R進程的情況下殺死ESS中的閃亮應用程序
- 19. 如何殺死當前正在運行的任務在Android Marshmallow
- 20. 殺死ssh會話殺死正在運行的進程
- 21. 如何殺死Java中的Python腳本?
- 22. 如何在WebView中殺死腳本?
- 23. 如何在不殺死整個程序的情況下立即殺死Perl線程?
- 24. 如何殺死
- 25. 殺死不會殺死進程
- 26. MySQL查詢殺死腳本
- 27. 殺死包含腳本'time.sleep()`
- 28. 無法殺死Python腳本
- 29. 無法殺死PHP腳本
- 30. 超時並殺死並行matlab執行
我相信你不能。然而,你可能巧妙地編寫了你的腳本...... –