[英]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.