【问题标题】:Return code of background process bash后台进程bash的返回码
【发布时间】:2023-03-15 01:51:02
【问题描述】:

如何获取后台进程的返回值? 如果我这样做,我会得到 0

#!/bin/bash
SomeCommand&
echo $?

输出: #~0

但如果我尝试

SomeCommand
echo $?

输出: #~255

我读过那个等待命令,但如果我这样做了

SomeCommand$
wait $!
echo $?

如果上一个命令未完成,我无法运行下一个命令。

【问题讨论】:

  • 如果进程仍在工作,则无法获取进程的退出状态。 0 表示您已在后台成功启动该作业。

标签: linux bash shell process


【解决方案1】:

wait 命令等待给定的background 作业完成。像这样使用它:

( sleep 5; exit 4 ) &
wait $!

ret=$?
echo $ret
4

$! 表示最近后台作业的进程 ID。

你可以这样做:

SomeCommand &
wait $!
echo $?

要启动多个后台作业并稍后检索它们的退出状态,请在启动每个作业后保存 $! 的值。

( sleep 5; exit 4 ) & b1_pid=$!
( sleep 5; exit 21 ) & b2_pid=$!

# More code

wait $b1_pid
b1_exit=$?
wait $b2_pid
b2_exit=$?

【讨论】:

  • 启动10个后台进程会怎样?如何获取返回码?因为启动一个后台进程并等待它是没有意义的。
  • wait 命令接受进程 ID 作为参数。您可以使用wait pid1 或wait pid2 等。
  • @chepner:感谢您添加重要的编辑部分。
  • 是否可以同时等待多个进程?例如wait $pid1 &; wait $pid2 &
  • wait 接受多个进程 ID,如果这是您需要的话。
【解决方案2】:
    #!/bin/bash
    command1 &
    commandN &
    for job in $(jobs -p)
    do
       wait $job
       echo $?
    done

【讨论】:

  • 虽然您的代码可能(或不)工作,但如果您添加有关错误的简要说明以及您的代码如何解决它,那就太好了。根据help center,它没有提供完整的答案
  • 如果在这个脚本之前已经启动了不相关的作业怎么办? jobs -p 将显示它们,您的脚本将等待不相关的作业
  • 我在我的机器上测试这个脚本并且jobs -p不显示无关的工作
猜你喜欢
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多