如何获取后台进程的退出状态?

如何获取后台进程的退出状态?

我正在运行两个mysqlsp在 bash 脚本中。我想同时启动它们(它们在远程服务器中运行)并将它们置于后台,完成后继续下一步。我想获取两者exit status(以防发生错误)。考虑到这一点,我尝试使用下面的sleep命令,但没有奏效。

编辑根据 Jeff Schaller 的回答: 以下是我尝试过的。

givinv@87-109:~$ sleep5 & PID5=$!; exit5=$?; sleep 4 & PID4=$!; exit4=$?; wait $PID5 $PID4; echo $exit5 $exit4
[1] 29530
[2] 29531
No command 'sleep5' found, did you mean:
 Command 'sleep' from package 'coreutils' (main)
sleep5: command not found
[1]-  Exit 127                sleep5
[2]+  Done                    sleep 4
0 0
givinv@87-109:~$ unset exit5 exit4
givinv@87-109:~$ sleep5 & exit5=$?;PID5=$!; sleep 4 & exit4=$?;PID4=$!; wait $PID5 $PID4; echo $exit5 $exit4
[1] 29535
[2] 29536
No command 'sleep5' found, did you mean:
 Command 'sleep' from package 'coreutils' (main)
sleep5: command not found
[1]-  Exit 127                sleep5
[2]+  Done                    sleep 4
0 0
givinv@87-109:~$ 

故意放置 sleep5(错误命令),但仍然得到0作为exit status。当我运行上面的命令时,我看到一行像[1]- Exit 127 sleep5.从脚本运行时是否可以捕获它?

如何获取exit status运行的两个命令同时地

答案1

bash 手册页,我的斜体强调:

等待

等待 [-n] [作业规范或 pid ...]

等待直到每个进程ID pid或作业规范jobspec指定的子进程退出并返回等待的最后一个命令的退出状态。

我认为您可能放错了背景符号&

睡眠 5 ;exit5=$? & PID5=$!;等待$PID5;回声 $?;回显 $exit5

说要睡5秒;完成后,将(零)退出代码设置exit5为后台进程;将该作业的作业 ID 设置为PID5;然后等待该任务完成;作业成功完成,因此echo显示为零;然后最后一个echo显示空行,因为后台进程(子shell)已退出,使exit5变量未分配(空)。

也许这就是您想要的情况?

睡眠 5 & PID5=$!;等待$PID5;退出5=$?;回显 $exit5

放入sleep 5后台,将其PID保存到PID5.等待进程退出,然后将其返回代码捕获到 中exit5,然后回显保存的返回代码。

相关内容