8

我想通过 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,因为每个程序本身都会产生新的子进程,没有办法找出来……)

4

1 回答 1

9

我尝试了以下方法(本地机器是 Debian;远程机器是 CentOS),它的工作方式完全符合我的预期:

    ~# ssh someone@somewhere 'nohup sleep 30 > out 2> err < /dev/null & echo $!'
    某人@某处的密码:
    14193
    ~#

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

    14193 ? 00:00:00 睡觉

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

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

于 2012-09-28T21:15:29.487 回答