gpt4 book ai didi

bash - 通过 ssh 获取以 nohup 启动的进程的 PID

转载 作者:行者123 更新时间:2023-11-29 08:55:04 25 4
gpt4 key购买 nike

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

最佳答案

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

    ~# ssh someone@somewhere 'nohup sleep 30 > out 2> err < /dev/null & echo $!'    someone@somewhere's password:    14193    ~#

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

    14193 ?        00:00:00 sleep

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

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

关于bash - 通过 ssh 获取以 nohup 启动的进程的 PID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12647382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com