从nohup + sudo获取pid并返回状态

时间:2013-12-21 07:02:27

标签: linux node.js shell sudo nohup

我有一个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?

2 个答案:

答案 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