GNU Parallel 在两个 cygwin 安装中对 SIGTERM 的行为不同

GNU Parallel 在两个 cygwin 安装中对 SIGTERM 的行为不同

考虑这个小的 bash 函数:

saySomethingToSomebody() {
    sleep 1
    echo "$1 $2." 
    sleep 2
}

当我呼叫时saySomethingToSomebody Hello Adam,它会说Hello Adam.并等待一会儿让他回应。

我想将其并行化以更有效地迎接聚会客人,但我也想防止悲剧发生,所以考虑这个使用 GNU 并行(由 perl 运行)的新变体:

saySomethingToSomebody() {
    sleep 1
    if [ "$2" == "Brutus" ]; then
        echo "It's him! Brutus! Take care, he might kill someone!"
        killall -TERM perl # Stops parallel from starting new jobs, lets old ones finish
    else
        echo "$1 $2." 
        sleep 2
    fi
}; \
export -f saySomethingToSomebody; \
parallel --jobs=3 saySomethingToSomebody "Hello" ::: Adam Brutus Caesar Doris Emily Francis

我有两个 Cygwin 安装。其中一个安装中,它的行为与我想要的一样:它看到BrutusSIGTERM 并将其发送给 perl,后者让其他两个问候语完成但不启动新作业:

parallel: SIGTERM received. No new jobs will be started.
parallel: Waiting for these 3 jobs to finish. Send SIGTERM again to stop now.
parallel: saySomethingToSomebody Hello Caesar
parallel: saySomethingToSomebody Hello Adam
parallel: saySomethingToSomebody Hello Brutus
It's him! Brutus! Take care, he might kill someone!
Hello Adam.
Hello Caesar.

在第二次 Cygwin 安装中,它什么也没有输出,所以我认为对Adam和 的Caesar问候被杀由 SIGTERM。

为什么会发生这种情况?我该怎么办?

答案1

在我两次安装之间,GNU parallel 的行为发生了变化:到目前为止,用于“停止并行启动新作业,让旧作业完成”的信号是 SIGHUP,而不再是 SIGTERM。

killall -HUP perl

在较新的安装上起作用。

Ole Tange 添加的信息:更改发生在版本20190322

相关内容