【问题标题】:Obtain the exit code for a known process id获取已知进程 ID 的退出代码
【发布时间】:2020-08-21 15:16:31
【问题描述】:

我有一个一个接一个并行触发的进程列表。而且,我需要知道所有这些进程完成执行时的退出代码,无需等待所有进程完成。

虽然status=$?; echo $status 会为执行的最后一个命令提供退出代码,但我如何知道任何已完成进程的退出代码,知道进程 ID?

【问题讨论】:

  • 感谢您的指点。解决方案很好,当我们可以按顺序等待所有进程终止时。但在这种情况下,我需要知道退出状态而不等待进程终止。例如,第一个(最快)完成的 pid 的退出代码是什么。
  • 使用包装器启动它们,该包装器在进程完成时对退出代码执行任何您想要的操作(例如,将其写入文件“winner”并杀死其余部分)。
  • 这需要更多细节和一些代码。我不明白你在这里问什么。是否要检索最早完成的作业的退出状态?
  • 如果不等待进程完成,您无法知道进程的退出状态。

标签: bash shell process pid


【解决方案1】:

您可以像这样使用 GNU Parallel 做到这一点:

parallel --halt=now,done=1 ::: ./job1 ./job2 ./job3

--halt=now,done=1 表示立即停止,一旦完成任何一项工作,立即终止所有未完成的工作并以完成工作的退出状态退出。

有成功退出、失败退出以及完成退出的选项。成功、失败或完成的工作的数量也可以以百分比的形式给出。请参阅文档here

【讨论】:

    【解决方案2】:

    使用包装器外壳函数保存后台作业 ID。之后可以查询每个作业的退出状态:

    #!/bin/bash
    
    jobs=()
    
    function run_child() {
        "$@" &
        jobs+=($!)
    }
    
    run_child sleep 1
    run_child sleep 2
    run_child false
    
    for job in ${jobs[@]}; do
        wait $job
        echo Exit Code $?
    done
    

    输出:

    Exit Code 0
    Exit Code 0
    Exit Code 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-17
      • 2021-03-17
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多