我需要一个bash脚本,执行以下操作:
>启动后台进程,将所有输出定向到文件
>将进程的退出代码写入文件
>返回进程的pid(立即,而不是当进程退出时)。
>脚本必须退出
$ executable >>$log 2>&1 & pid=`jobs -p`
$ executable >>$log; # blocked on prevIoUs line until process exits echo $0 >>$log;
我如何在同一时间做所有这些?
pid是在$ !,不需要运行作业。并且返回状态由等待返回:
$executable >> $log 2>&1 & pid=$! wait $! echo $? # return status of $executable
编辑1
如果我理解注释中所述的附加要求,并且希望脚本立即返回(不等待命令完成),那么将无法让初始脚本编写命令的退出状态。但是很容易让中间人在孩子完成后写出退出状态。就像是:
sh -c "$executable"' & echo pid=$! > pidfile; wait $!; echo $? > exit-status' &
应该工作。
编辑2
如在注释中指出的,该解决方案具有争用条件:主脚本在写入pidfile之前终止。 OP通过做轮询睡眠循环来解决这个问题,这是一个可憎的事,我担心我会在晚上睡觉,知道我可能已经激发了这样的耻辱。海事组织,正确的做法是等到孩子完成。因为这是不可接受的,这里是一个解决方案阻塞在读取,直到pid文件存在,而不是做循环休眠:
{ sh -c "$executable > $log 2>&1 &"' echo $! > pidfile echo # Alert parent that the pidfile has been written wait $! echo $? > exit-status ' & } | read