加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何从bash脚本获取进程标识和退出代码?

发布时间:2020-12-15 09:08:55 所属栏目:安全 来源:网络整理
导读:我需要一个bash脚本,执行以下操作: 启动后台进程,将所有输出定向到文件 将进程的退出代码写入文件 返回进程的pid(立即,而不是当进程退出时)。 脚本必须退出 我可以得到pid但不是退出代码: $ executable $log 21 pid=`jobs -p` 或者,我可以捕获退出代码
我需要一个bash脚本,执行以下操作:

>启动后台进程,将所有输出定向到文件
>将进程的退出代码写入文件
>返回进程的pid(立即,而不是当进程退出时)。
>脚本必须退出

我可以得到pid但不是退出代码:

$ executable >>$log 2>&1 &
pid=`jobs -p`

或者,我可以捕获退出代码,但不能捕获pid:

$ 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读