通过ssh获取nohup进程的PID
问题描述:
我想通过ssh启动一个进程的PID。通过ssh获取nohup进程的PID
我有一个bash脚本,并在这里是我写的:
SSH_COMMAND='ssh'
cmd=`eval $my_cmd`
PROG_CMD="$program $cmd"
$SSH_COMMAND [email protected] "(nohup $PROG_CMD) & echo "'$!'" > prog.pid"
注意变量“计划”和“my_cmd”在一个JSON文件中定义(和分别含有我的程序和命令开始我的程序)。
我的程序在服务器上以启动的方式启动,但我没有在prog.pid
文件中正确的PID(即:程序的PID)。
编辑:我做了SSH_COMMAND的回声,我得到了:
ssh [email protected] (my_program args > output.log 2>&1 &) & echo $! > prog.pid
ARGS:MY-的参数
output.log:登录我的程序
答
不要使用(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] #
+0
你是对的,我删除了&,PID是正确的。而且,你的答案完全解释了发生的情况,非常感谢你。 – klaus
答
写入文件的文件本地计算机上的prog.pid(带远程pid)只需从报价单中删除重定向
$SSH_COMMAND [email protected] "(nohup $PROG_CMD) & echo "'$!' > prog.pid
如果PID想是SSH本地进程echo $!
必须退出SSH命令
$SSH_COMMAND [email protected] "(nohup $PROG_CMD)" & echo $! > prog.pid
其中prog.pid在服务器的根目录的主目录预期? –
不,prog.pid位于“本地机器”上,我在那里执行ssh命令。但问题不在这里。我有一个PID写在里面的prog.pid文件...它只是不正确的! – klaus
在第一个命令prog.id是在ssh命令之间的双引号之间所以期待在远程 –