2017-01-24 59 views
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催生

+0

看看你是否可以改寫你的代碼,而不是在其正常模式下使用並行。然後它開箱即用。 (並考慮只運行一次--bibtex)。 –

回答

1

您可以使用陷阱來捕獲您的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
  • 的所有進程