我想通过 ssh 在远程机器上使用 nohup 启动一个进程。问题是如何让进程的PID以nohup启动,所以“进程实际上在做某事”,而不是一些外壳实例等。另外,我想将 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'
但我不知道在哪里放置“回声$!” 以便它显示在我的本地外壳中。它总是向我显示错误的 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,因为每个程序本身都会产生新的子进程,没有办法找出来……)