簡體   English   中英

從nohup + sudo獲取pid並返回狀態

[英]Get the pid and return status from nohup + sudo

我有一個shell片段:

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

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

我期望的是,如果node server.js正常運行,然后將此過程的pid記錄到文件pids中。

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

那么如何在上述shell腳本中獲取node server.js的正確返回碼和pid?

當您在后台運行命令時,如果不wait進程完成(例如, node不再運行),shell便無法通過明智的方式獲取返回代碼。 因此,即使這些都具有返回碼0:

$ false &
$ does_not_exist &

看來您想要做的是檢查守護程序是否正確啟動 ,這完全取決於守護程序。 在您的情況下,您已經啟動了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
}

我的最終解決方案:

#!/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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM