【发布时间】:2020-01-25 00:39:04
【问题描述】:
是否可以在 Bash 中生成多个进程,并在最后一个进程完成后,报告有多少进程正确终止/没有核心转储?
或者在 Python 中这样做会更好吗?
(如果有的话,我希望报告哪个命令失败)
【问题讨论】:
标签: bash
是否可以在 Bash 中生成多个进程,并在最后一个进程完成后,报告有多少进程正确终止/没有核心转储?
或者在 Python 中这样做会更好吗?
(如果有的话,我希望报告哪个命令失败)
【问题讨论】:
标签: bash
您有望利用 GNU Parallel 及其故障处理。一般示例:
parallel ::: ./processA ./processB ./processC
具体示例...这里我运行 3 个简单的作业,每个作业都用单引号括起来,并将其设置为在所有作业完成或失败后停止:
parallel --halt soon,fail=100% ::: 'echo 0 && exit 0' 'echo 1 && exit 1' 'echo 2 && exit 2'
输出
0
1
parallel: This job failed:
echo 1 && exit 1
2
parallel: This job failed:
echo 2 && exit 2
默认情况下,它将并行运行N 作业,其中N 是您的CPU 拥有的内核数,如果您只想按顺序运行作业,请使用:
parallel -j 1 ...
显然,您可以通过grep -c "This job failed" 管道输出以计算失败次数。
【讨论】:
假设您有一个包含命令的文件:
cmd1
cmd2
cmd3
然后,只要您最多有 100 次失败,这将为您提供失败的作业数:
cat file | parallel
a=$?; echo $((`wc -l <file`-$a))
要准确了解哪些作业失败,请使用--joblog。
cat file | parallel --joblog my.log
# Find non-zero column 7
grep -v -P '(.*\t){6}0\t.*\t' my.log
【讨论】:
这很容易。
首先在后台运行您的作业。记住 pid。
然后对每个子进程执行wait $pid 并查看wait 退出状态,这等于您传递给它的子进程pid 的退出状态。
如果退出状态为零,则表示子进程成功终止。
#!/bin/bash
exit 0 &
childs+=($!)
exit 1 &
childs+=($!)
exit 2 &
childs+=($!)
echo 1 &
childs+=($!)
successes=0
for i in "${childs[@]}"; do
wait $i
if (($? == 0)); then
((successes++))
fi
done
# will print that 2 processes (exit 0 and echo 1) terminated successfully
printf "$successes processes terminated correctly and didn't core dump\n"
【讨论】: