【问题标题】:Can bash spawn multiple processes and report how many ran successfully?bash 可以生成多个进程并报告成功运行的进程数吗?
【发布时间】:2020-01-25 00:39:04
【问题描述】:

是否可以在 Bash 中生成多个进程,并在最后一个进程完成后,报告有多少进程正确终止/没有核心转储?

或者在 Python 中这样做会更好吗?

(如果有的话,我希望报告哪个命令失败)

【问题讨论】:

标签: bash


【解决方案1】:

您有望利用 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" 管道输出以计算失败次数。

【讨论】:

    【解决方案2】:

    假设您有一个包含命令的文件:

    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
    

    【讨论】:

      【解决方案3】:

      这很容易。

      首先在后台运行您的作业。记住 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"
      

      【讨论】:

        猜你喜欢
        • 2011-12-19
        • 2017-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-13
        • 2019-05-26
        • 1970-01-01
        • 2021-01-25
        相关资源
        最近更新 更多