【问题标题】:Printing the pid of just started process before its output在输出之前打印刚刚启动的进程的 pid
【发布时间】:2015-12-06 16:49:49
【问题描述】:

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

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

my_cmd & echo $!;等待$!;回声 $?;

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

pid
...stdout...
exit_status

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

...stdout...
pid
exit_status

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

【问题讨论】:

    标签: linux bash shell unix ssh


    【解决方案1】:

    当您运行后台程序时,它是一个独立的进程,如果需要按定义的顺序输出,则需要进行一些同步。但是这个问题可以通过 exec 和额外的 shell 脚本轻松解决:

    第一个脚本,比如说start:

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

    第二个脚本start2:

    #!/bin/bash
    echo $$
    exec my_cmd
    

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

    【讨论】:

    • 谢谢!我使用了您的想法并对其进行了一些修改以编写bash -c 'echo $$; exec my_cmd ' ; echo $?。到目前为止运行良好,不知道它是否也是一个稳定的解决方案
    • 似乎没问题,但我猜 echo $? 不会被调用,因为 shell 之前调用了 exec。所以我认为打印输出的顺序会更正,但不会打印结果。不过我没有测试它。
    【解决方案2】:

    是的,当您使用 & 时,您正在调用后台进程并将其输出到标准输出,正如您所举例说明的那样......这就是重点。您的流程执行和 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 表示标准输出和标准错误)重定向到 $o(指向 /tmp/_o)。

    然后我们显示 pid

    然后我们等待pid

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

    然后我们将输出连接起来,按照您的意愿显示出来..

    然后我们显示返回

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 2014-11-17
      • 2016-05-11
      • 2023-03-08
      • 2012-04-07
      相关资源
      最近更新 更多