2
#!/bin/bash
for i in {1..3}; do
sem --no-notice --id $$ -j+0 sleep 10 ";" echo Done
done
sem --no-notice --id $$ --wait
啓動它,那麼如何讓按Ctrl +Ç向終止所有睡覺的所有作業?殺死通過SEM催生
#!/bin/bash
for i in {1..3}; do
sem --no-notice --id $$ -j+0 sleep 10 ";" echo Done
done
sem --no-notice --id $$ --wait
啓動它,那麼如何讓按Ctrl +Ç向終止所有睡覺的所有作業?殺死通過SEM催生
您可以使用陷阱來捕獲您的SIGINT
信號並手動殺死您的信號量產生的所有進程。看看下面的腳本:
#!/bin/bash
shopt -s nullglob #safety needed so that globs return empty strings when no files are present
trap kill_sem INT
function kill_sem() {
for s in ~/.parallel/semaphores/id-$$/*@*;
do
kill -15 -- -$(basename ${s%%@*})
done
}
for i in {1..3}; do
sem --no-notice --id $$ -j+0 sleep 45 ";" echo Done
done
sem --no-notice --id $$ --wait
說明:
trap kill_sem INT
:有些行爲相若方式來try ... catch
塊在其他語言,但有信號,而不是例外。在此,它等待INT
信號(CTRL + C),並在發生這種情況時執行kill_sem
函數。 Link to trap documentation。
當你創建sem
一個信號,它會創建使用下面的命名模式的文件:~/.parallel/semaphore/id-MYSCRIPT_PID/[email protected]
$(basename ${s%%@*})
:提取從所有這些文件的SEM_PID
,並把它作爲在該PID_GROUP
殺死命令kill -15 -- -PID_GROUP
:所述SIGTERM
信號發送給屬於該組的PID_GROUP
看看你是否可以改寫你的代碼,而不是在其正常模式下使用並行。然後它開箱即用。 (並考慮只運行一次--bibtex)。 –