【问题标题】:Get the PID of a process started with nohup via ssh通过 ssh 获取以 nohup 启动的进程的 PID
【发布时间】:2012-09-20 18:34:16
【问题描述】:

我想通过 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'

但我不知道在哪里放置“echo $!”以便它显示在我的本地外壳中。它总是向我显示错误的 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,因为每个程序本身都会产生新的子进程,没有办法找出来……)

【问题讨论】:

    标签: bash ssh pid nohup


    【解决方案1】:

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

    ~# ssh someone@somewhere 'nohup sleep 30 > out 2> err

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

    14193 ? 00:00:00 睡觉

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

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

    【讨论】:

    • 嗯,你是对的,但标准输出似乎仍然存在问题。例如,如果我将“sleep 30”替换为产生输出的内容,例如“echo Hello World!”,它不会出现在文件“out”中,而是像 PID 一样返回给我。跨度>
    • 我想我添加了“bash -c”是因为我想连续执行多个命令,比如“echo foo;sleep 30;echo bar”。
    • 你好 Lotharyx,你能解释一下重定向流程吗?我猜 > 是主输出,2> 是错误,但是 /null 流是什么?
    • @JesusTheHun:就像 > 重定向标准输出和 2> 重定向标准错误,
    • 但是为什么需要为睡眠提供输入源呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2011-05-10
    • 2013-02-07
    • 1970-01-01
    • 2017-05-19
    相关资源
    最近更新 更多