通过ssh获取nohup进程的PID
Get PID of nohup process through ssh
我想获取通过 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(使用远程 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
不要使用 (command &) &
。只需使用 (command) &
(或 command &
)。对于 (command &) &
,Bash 需要 fork 另一个子 shell 到 运行 命令,因此 $!
将是PID的子shell非命令
参见以下示例:
[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] #
我想获取通过 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(使用远程 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
不要使用 (command &) &
。只需使用 (command) &
(或 command &
)。对于 (command &) &
,Bash 需要 fork 另一个子 shell 到 运行 命令,因此 $!
将是PID的子shell非命令
参见以下示例:
[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] #