#!/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 + C 终止所有睡眠?
答案 0 :(得分: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/SEM_PID@HOST
$(basename ${s%%@*})
:从所有这些文件中提取SEM_PID
,并将其用作kill命令中的PID_GROUP
kill -15 -- -PID_GROUP
:将SIGTERM
信号发送给属于该组的所有进程PID_GROUP