考虑这个小的 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 安装。其中一个安装中,它的行为与我想要的一样:它看到Brutus
SIGTERM 并将其发送给 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。