我有一个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?
答案 0 :(得分: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
}
答案 1 :(得分: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