杀掉所有由sem产生的工作

时间:2017-01-24 09:28:13

标签: bash gnu-parallel

#!/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 终止所有睡眠?

1 个答案:

答案 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