通过ssh获取通过nohup启动的进程的PID

时间:2012-09-28 21:05:27

标签: bash ssh pid nohup

我想通过ssh在远程计算机上使用nohup启动进程。问题是如何使用nohup启动进程的PID,因此“进程实际上正在做某事”,而不是某些外壳实例等。另外,我想将stdout和stderr存储在文件中,但这不是问题......

在本地,它使用

完美无瑕地工作
nohup sleep 30 > out 2> err < /dev/null & echo $!

它回应了我命令“sleep 30”的确切PID,我也可以看到它使用“top”或“ps aux | grep sleep”。

但我在通过ssh远程执行此操作时遇到了麻烦。我试过像

这样的东西
ssh remote_machine 'nohup bash -c "( ( sleep 30 ) & )" > out 2> err < /dev/null'

但我无法弄清楚“echo $!”的位置以便它显示在我的本地shell中。它总是向我显示错误的PID,例如“bash”实例之一等。

有人知道如何解决这个问题吗?

编辑: 好的,这里可能不需要“bash -c”。就像Lotharyx指出的那样,我使用

得到了正确的PID
ssh remote 'nohup sleep 30 > out 2> err < /dev/null & echo $!'

但问题是,如果你用产生输出的东西代替“sleep 30”,比如“echo Hello World!”,那么输出不会在文件“out”中结束,既不在本地也不在偏远的一面。有人知道为什么吗?

EDIT2:我的错!另一台设备上没有剩余空间,这就是“out”和“err”文件保持空白的原因!

所以这是有效的。另外,如果一个人想要连续调用多个命令,用分号(;)分隔,那么仍然可以使用“bash -c”,如下所示:

ssh remote 'nohup bash -c "echo bla;sleep 30;echo blupp" > out 2> err < /dev/null & echo $!'

然后它在本地打印出“bash -c”的PID,这很好。 (不可能获得“最内层”或“忙碌”过程的PID,因为每个程序本身都可以产生新的子过程,没有办法找出...)

1 个答案:

答案 0 :(得分:9)

我尝试了以下内容(本地计算机是Debian;远程计算机是CentOS),它完全按照我的预期运行:

    ~# ssh someone@somewhere 'nohup sleep 30 > out 2> err < /dev/null & echo $!'
    someone@somewhere's password:
    14193
    ~#

在远程机器上,我做了ps -e,看到了这一行:

    14193 ?        00:00:00 sleep

所以,很明显,在我的本地机器上,输出是在远程机器上执行的“睡眠”PID。

为什么在通过SSH隧道发送bash时会为命令添加bash?