2017-07-17 70 views
2

我正在運行一堆shell腳本,如 parallel -a my_scripts bash 並且在某些時候,我決定我已經運行了足夠的這些腳本,並且希望停止產生新的作業,並讓所有現有作業完成。換句話說,我想殺死父母的過程而不殺害孩子。如何在不殺死正在運行的作業的情況下終止GNU並行?

似乎有ways of controlling termination when first launching GNU parallel(例如,如果我事先知道,我只想要運行x工作,然後我可以使用--halt now,success=x參數),但我找不到如何控制GNU平行時,它已經在運行。

當然,我可以只是CTRL+C殺死並行,並重新運行被中止的工作,但我認爲可能有一個更聰明的方法。

+1

有可能是一種方式與** GNU並行**做到這一點,但另一種選擇可能是使用Redis的這樣...... https://stackoverflow.com/a/22220082/2836621 –

+0

**任務後臺程序**可能是另一種可能性... http://www.ubuntugeek.com/task-spooler-personal-job-scheduler.html –

回答

4

我想通了。答案是簡單地將SIGTERM發送給父節點parallel進程(只需kill即可)。 parallel然後用下面的迴應(在這種情況下,我有4個工作運行):

我挖它出來的手冊頁:

完成運行作業,但不啓動新工作
如果你後悔 開始很多工作,你可以簡單地打破GNU並行,但是如果你想確保你沒有半完成的工作,你應該發送信號SIGTERM到GNU並行:

killall -TERM並行

這將告訴GNU並行不會啓動任何新作業,而是等待 ,直到退出之前當前正在運行的作業完成。

+0

SIGTERM與SIGKILL有很大不同。請修復你的答案。 SIGKILL不會做你想做的。 –

+0

抱歉,錯字;固定 –

+1

請讓我們知道,如果你覺得它可以更好地記錄下來,所以它會更容易找到。 –

相關問題