2013-12-21 21 views
2

pid和返回狀態我有一個shell代碼片段:獲得來自nohup的+須藤

nohup sudo node server.js >> node.log 2>&1 & 

if [ $? -eq 0 ]; then 
    echo $! $? 
    echo $! > pids 
fi 

我想到的是,如果node server.js運行normaly,然後記錄這個過程中對文件的PID:PID的。

但它不起作用,$?始終爲0,因爲它是sudo進程的狀態? 而$!也不是node命令的進程的pid。

那麼如何才能在上面的shell腳本中獲得正確的返回碼和node server.js的pid?

+0

你應該使用sudo運行的腳本,而不是。在腳本中執行sudo是一種不好的做法。 – mekwall

+0

爲什麼不使用forever.js? –

回答

3

我的最終解決方案:

#!/usr/bin/env bash 

ROOT=$(cd `dirname $0`; pwd) 

sudo kill -9 `cat ${ROOT}/pids` || true 

nohup sudo node server.js >> node.log 2>&1 & 

sleep 1 

pid=$(ps --ppid $! | tail -1 | awk '{ print $1 }') 

if echo $pid | egrep -q '^[0-9]+$'; then 
    echo $pid > ${ROOT}/pids 
else 
    echo 'server not started!' 
fi 
+0

您可能想在[代碼評論](http://codereview.stackexchange.com/)上發佈此信息。在這裏做太多的事情需要評論。 – l0b0

+0

@ l0b0好主意。謝謝, :)。 – atupal

+0

在RH Linux上,我通過pid = $(ps -e | grep $!| awk'{print $ 1')更改您的行pid = $(ps --ppid $!| tail -1 | awk'{print $ 1}') }')來獲得pid。您的行將返回的標題中的第一個字是PID – Phiber

3

當您在後臺運行命令時,沒有明智的方法讓shell在沒有wait的情況下獲取返回碼,以便進程結束(即node不再運行)。因此,即使這些都返回代碼0:

$ false & 
$ does_not_exist & 

看來你想要做的是check whether a daemon started properly,這完全依賴於後臺程序。在你的情況,你已經開始了一個Node.js的服務器,所以你可以簡單地運行像這樣(未經):

test_if_server_is_running() { 
    tries=10 
    while [ "$tries" -gt 0 ] 
    do 
     let tries-- 
     wget http://127.0.0.1/some_server_path && return 
     sleep 1 
    done 
    return 1 # Did not start up in at least 10 seconds 
} 
+0

使用'wget'來檢查也是一種有用的方法。 :)。謝謝。 – atupal