【问题标题】:Get PID of nohup process through ssh通过ssh获取nohup进程的PID
【发布时间】:2017-05-26 07:55:00
【问题描述】:

我想获取我通过 ssh 启动的进程的 PID。

我有一个 bash 脚本,这是我写的:

SSH_COMMAND='ssh'
cmd=`eval $my_cmd`
PROG_CMD="$program $cmd"
$SSH_COMMAND root@server "(nohup $PROG_CMD) & echo "'$!'" > prog.pid"

请注意,变量“program”和“my_cmd”是在 JSON 文件中定义的(分别包含我的程序和启动程序的命令)。

我的程序在服务器上完全按照它应该启动的方式启动,但我在 prog.pid 文件中没有正确的 PID(即:程序的 PID)。

编辑:我对 SSH_COMMAND 做了一个回显,我得到了:

 ssh root@server (my_program args > output.log 2>&1 & ) & echo $! > prog.pid

args : my_program 的参数

output.log : 我的程序的日志文件

【问题讨论】:

  • prog.pid 应该在服务器的根目录中的哪里?
  • 不,prog.pid 位于“本地机器”上,我在那里执行 ssh 命令。但问题不在这里。我有一个带有 PID 的 prog.pid 文件......它只是不正确的!
  • 在第一个命令中 prog.id 是在双引号之间的 ssh 命令中,所以在远程
  • 报价很好,恕我直言。
  • 我没有说引号是错误的,但是该命令没有按预期执行,因为第一个命令默认情况下会在当前工作目录中的远程服务器上创建一个文件根目录

标签: bash ssh pid


【解决方案1】:

不要使用(command &) &。只需使用(command) &(或仅使用command &)。对于 (command &) &,Bash 需要 fork 另一个子 shell 来运行命令,因此 $! 将是子 shell 的 PID 而不是命令。

参见以下示例:

[STEP 124] # (nohup sleep 1234 > /dev/null 2>&1 &) &
[1] 44420      <=== this is the PID of the sub-shell which died immediately
[STEP 125] #
[1]+  Done                    ( nohup sleep 1234 > /dev/null 2>&1 & )
[STEP 126] # ps p 44420  <=== as you can see this PID does not exist any more
   PID TTY      STAT   TIME COMMAND
[STEP 127] # ps -C sleep u
USER        PID  TTY      STAT START   TIME COMMAND
root      44421  pts/13   S    17:48   0:00 sleep 1234
[STEP 128] # kill 44421
[STEP 129] #

这样可以正常工作:

[STEP 131] # (nohup sleep 1234 > /dev/null 2>&1) &
[1] 44424         <=== this is the PID of the sleep command
[STEP 132] # ps p 44424 u
USER        PID  TTY      STAT START   TIME COMMAND
root      44424  pts/13   S    17:49   0:00 sleep 1234
[STEP 133] #

【讨论】:

  • 你是对的,我删除了 & 并且 PID 是正确的。此外,您的回答完美地解释了会发生什么,非常感谢。
【解决方案2】:

要在本地机器上写入文件 prog.pid(带有远程 pid),只需从引号内发出重定向

$SSH_COMMAND root@server "(nohup $PROG_CMD) & echo "'$!' > prog.pid

如果要的pid是ssh本地进程echo $!必须取出ssh命令

$SSH_COMMAND root@server "(nohup $PROG_CMD)" & echo $! > prog.pid

【讨论】:

  • 不,我试过了,它没有改变任何东西。问题不在于在文件中写入 PID,而是写入好的 PID!
  • 您是否正确阅读了问题中的答案,因为不清楚哪个 PID 有趣,第一个命令给出了在远程服务器上执行的 nohup 命令的 PID,而第二个是本地 ssh 命令的 PID
  • 我对获取 nohup 命令的 PID 很感兴趣,我尝试了您的答案,将重定向从内部引号中取出,并且 prog.pid 中的 PID 是 11043,而我的程序的实际 PID 是 11044。
  • 这可能是由于括号最初是他们启动一个子shell,所以11043是远程shell进程的PID,11044是子shell,去掉括号
  • 我不确定,但@whjm 的回答解决了这个问题。
猜你喜欢
  • 2012-09-20
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 2017-05-19
  • 2014-12-28
  • 1970-01-01
相关资源
最近更新 更多