在输出之前打印刚刚启动的进程的pid

时间:2015-12-06 16:49:49

标签: linux bash shell unix ssh

我通过SSH控制远程Linux机器,我需要能够知道进程运行时的进程的pid以及运行后的退出状态

我的尝试是通过SSH发出此命令

  

my_cmd& echo $!;等一下! echo $?;

因此输出如下,正是我需要的:

pid
...stdout...
exit_status

现在有时会发生命令太快,所以我会得到类似的东西:

...stdout...
pid
exit_status

有没有办法防止这种行为?

2 个答案:

答案 0 :(得分:2)

运行后台程序时,它是一个独立的进程,如果需要以定义的顺序输出,则必须进行一些同步。但是这个特殊的东西可以通过exec和附加的shell脚本轻松解决:

第一个脚本,比方说start

#!/bin/bash
start2 &
wait $!
echo $?

第二个脚本start2

#!/bin/bash
echo $$
exec my_cmd

现在第一个脚本启动第二个脚本并等待结果。第二个脚本打印自己的pid然后执行程序,该程序将使用与第二个脚本相同的pid运行。

答案 1 :(得分:0)

是的,当你使用&你正在举例说明你正在调用一个后台进程,其输出到stdout ......这就是重点。你的流程执行和stdout打印发生的速度比pid查询和打印等都要快....所以我建议你将stdout重定向到/ tmp / tempfile,然后在你需要输出打印时准确打印它。 ......示例:

$ o=/tmp/_o; your_cmd 1>$o 2>$o & echo "pid is $!"; wait $!; r=$?; cat $o; echo "return is $r"; rm -f $o

首先我们设置输出变量' o'到' / tmp / _o'临时文件

然后我们运行your_cmd将所有输出(1和2,这意味着stdout和stderr)重定向到$ o(指向/ tmp / _o)。

然后我们展示了pid

然后我们等待pid

然后我们设置return var' r' (在输出后显示)

然后我们连接输出,按你的意愿显示它..

然后我们显示返回

然后我们删除了临时文件' o' ..

希望这种方式适用于您的情况.. 希望你不要认为它过于复杂。 希望有人回答一个简单的方法为你解决这个问题..