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

我有一个shell的片段:

nohup sudo node server.js >> node.log 2>&1 & if [ $? -eq 0 ]; then echo $! $? echo $! > pids fi 

我期望的是,如果node server.js运行正常,然后logging此进程的PID到文件:pids。

但它不起作用, $? 总是0,因为这是sudo进程的状态? 而$! 也不是node命令进程的pid。

那么如何才能在上面的shell脚本中获得正确的返回码和node server.js pid?

当你在后台运行一个命令时,没有明确的方法让shell在不wait进程结束的情况下获得返回码(即node不再运行)。 所以即使这些有返回码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