通过ssh获取nohup进程的PID

问题描述 投票:0回答:2

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

bash ssh pid
2个回答
4
投票

不要使用

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

参见以下示例:

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

这会很好用:

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

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
© www.soinside.com 2019 - 2024. All rights reserved.