我想通过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,因为每个程序本身都可以产生新的子进程,因此无法找出...)
嗯,你是对的,但似乎仍然存在与标准输出的问题。例如,如果我将“sleep 30”替换为产生输出的东西,比如“echo Hello World!”,它不会以文件“out”结尾,而是像PID一样返回给我。 –
我想我加了“bash -c”,因为我想连续执行多个命令,比如“echo foo; sleep 30; echo bar”。 –
我的错,你的解决方案绝对有效! –