2017-05-26 177 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