2012-09-28 57 views
8

我想通过ssh在远程计算机上使用nohup启动进程。问题是如何获得以nohup启动的进程的PID,所以“进程实际上正在做些什么”,而不是某个外壳实例之类。另外,我想存储在文件输出和错误,但是这不是这里的问题...获取通过ssh使用nohup启动的进程的PID

在本地,它完美的作品使用

nohup sleep 30 > out 2> err < /dev/null & echo $! 

它呼应了我的命令的具体PID“睡30“,我也可以看到使用”顶部“或”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 $!' 

但随后的问题是,如果你代替“休眠30”的东西,产生输出,也就是说,“呼应的Hello World!”,即输出不会在文件“out”中出现,既不在本地也不在远程端。有人知道为什么吗?

编辑2:我的错!另一台设备上没有剩余空间,这就是为什么文件“出”和“错误”保持空白的原因!

所以这是行之有效的。此外,如果一个要调用的多个命令中的行,用分号(;)隔开,一个仍然可以使用“的bash -c”,像这样:

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

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

回答

8

我尝试了以下方法(本地该机是Debian的;远程机器是CentOS的),和它的工作正是我想你期待:

 
    ~# ssh [email protected] 'nohup sleep 30 > out 2> err < /dev/null & echo $!' 
    [email protected]'s password: 
    14193 
    ~# 

在远程机器上,我没有PS -e,看到这一行:

 
    14193 ?  00:00:00 sleep 

因此,显然,在我的本地机器上,输出是在远程机器上执行的“睡眠”PID。

为什么在通过SSH隧道发送命令时将bash添加到您的命令中?

+0

嗯,你是对的,但似乎仍然存在与标准输出的问题。例如,如果我将“sleep 30”替换为产生输出的东西,比如“echo Hello World!”,它不会以文件“out”结尾,而是像PID一样返回给我。 –

+0

我想我加了“bash -c”,因为我想连续执行多个命令,比如“echo foo; sleep 30; echo bar”。 –

+0

我的错,你的解决方案绝对有效! –