我正在运行两个mysql
sp在 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
,然后回显保存的返回代码。