2017-05-26 350 views
0

我想通过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:登录我的程序

+0

其中prog.pid在服务器的根目录的主目录预期? –

+0

不,prog.pid位于“本地机器”上,我在那里执行ssh命令。但问题不在这里。我有一个PID写在里面的prog.pid文件...它只是不正确的! – klaus

+0

在第一个命令prog.id是在ssh命令之间的双引号之间所以期待在远程 –

回答

1

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

0

写入文件的文件本地计算机上的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 
+0

不,我试过了,它没有改变任何东西。问题不在于在文件中写入PID,而是编写好的PID! – klaus

+0

你有没有正确地阅读答案,因为它不清楚哪个PID很有趣,第一个命令给出了在远程服务器上执行的nohup命令的PID,而第二个本地ssh命令的PID是 –

+0

我有兴趣获取nohup命令的PID,我尝试了你的答案,从里面引用中重定向,并且prog.pid中的PID是11043,而我的程序的真实PID是11044. – klaus