Answers:
您可以使用一个流程组:
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
被启用,因此外(...)
,所有内创建的进程将被放置在同一个进程小组。
对于dash
和其他ash
基于炮弹,那只能在顶级shell进程。因此,除非将其放在子外壳中,否则该代码将起作用。
这在AT&T ksh
或旧的SysV / Bourne Shell中根本不起作用。
kill 0
向当前进程组的所有成员发送SIGTERM信号。
bash
,dash
,yash
,mksh
,zsh
。基本上是任何POSIX外壳,但AT&T ksh除外。set -m
在POSIX中(不足)指定,但作为可选功能。
kill 0
杀死进程组的所有成员,无论其父级是什么。请参阅ps -j
以查看进程组ID。
这是一个例子。首先玩这个游戏,以获取您真正需要的东西。它不能破坏很多。
#!/bin/bash
# Example of killing off all children
> killfile
> outfile.err
kill_em()
{
echo 'killing all children ' > 2
while read pid
do
kill -0 $pid && kill -9 $pid # if still running kill it
done < killfile
exit 1
}
export grandparentpid=$$
trap 'kill_em' 6
for i in 2 2 3 4 5 6 7 8 9 10
do
( sleep $i && ls oinkle >> outfile 2>> outfile.err &
pid=$!
echo $pid >> killfile
wait $!
[ $? -ne 0 ] && kill -6 $grandparentpid
) &
done
wait
此安装程序有意失败,因为它ls oinkle
会失败(在我的机器上)。
修改了启动脚本后,在您得到所需的内容时,请执行以下操作:-更改:
for i in 2 2 3 4 5 6 7 8 9 10
至:
for part in input_*
更改:
sleep $i && ls oinkle
至:
python3 $part
重定向在那里保存日志。您可能不想要它们。
killfile
作业都未启动之前就失败了,则您的作业可能不包含已启动的所有作业的pid。
[ $? -ne 0 ]
...