通过ssh获取nohup进程的PID

时间:2017-05-26 07:55:00

标签: bash ssh pid

我想获得一个我通过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:我程序的日志文件

2 个答案:

答案 0 :(得分:3)

不要使用(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] #

答案 1 :(得分:0)

要在本地计算机上编写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