微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

bash – 如果任何生成的子进程失败,则kill all并退出

在我的脚本中,我将数据集拆分为input_aa,input_ab等.然后,我通过相同的Python脚本运行每个,如下所示:

# Execute program on each split file
for part in input_*; do
        python3 $part &
done
wait

我的问题是双重的:如何检测到Python进程失败,并且在检测到时,如何杀死所有生成的子进程并在失败时退出脚本?

解决方法:

您可以使用进程组:

set -m
(
   for part in input_*; do
     (python3 "$part" || kill 0) &
   done
   wait
)

set -m(以及可选的POSIX shell功能,必需的Unix shell功能)在自己的进程组中运行作业.在bash,yash,zsh,mksh中,这是子shell的作业,其中set -m被启用,因此外部(…)和在其中创建的所有进程将被放置在同一个进程组中.

对于破折号和其他基于灰的shell,它只适用于顶级shell进程.因此代码将起作用,除非它放在子shell中.

这根本不适用于AT& T ksh或旧的SysV / Bourne shell.

kill 0将SIGTERM信号发送给当前进程组的所有成员.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐