Linux 从nohup+;获取pid和返回状态;苏多

Linux 从nohup+;获取pid和返回状态;苏多,linux,node.js,shell,sudo,nohup,Linux,Node.js,Shell,Sudo,Nohup,我有一个shell片段: nohup sudo node server.js >> node.log 2>&1 & if [ $? -eq 0 ]; then echo $! $? echo $! > pids fi 我期望的是,如果节点server.js正常运行,那么将此进程的pid记录到文件:pids中 但是它不工作,$?总是0,因为它是sudo进程的状态? 还有$也不是节点命令过程的pid 那么,如何在上面的shell脚本中获得节点服务器

我有一个shell片段:

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

if [ $? -eq 0 ]; then
  echo $! $?
  echo $! > pids
fi
我期望的是,如果
节点server.js
正常运行,那么将此进程的pid记录到文件:pids中

但是它不工作,
$?
总是0,因为它是sudo进程的状态? 还有
$
也不是
节点
命令过程的pid


那么,如何在上面的shell脚本中获得
节点服务器.js的正确返回代码和pid呢?

当您在后台运行命令时,shell在不等待进程完成(即,
节点
不再运行)的情况下获取返回代码是不明智的。因此,即使这些也有返回代码0:

$ false &
$ does_not_exist &
看起来您想要做的是,这完全取决于守护进程。在您的例子中,您已经启动了Node.js服务器,因此您可以简单地运行以下内容(未经测试):

我的最终解决方案:

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

您应该改为使用sudo运行脚本。在脚本中执行sudo是一种糟糕的做法。为什么不使用forever.js?使用
wget
检查也是一种有用的方法。谢谢。你可能想把这个发到网上。在RH Linux上,我将您的行pid=$(ps-ppid$!| tail-1 | awk'{print$1}')更改为pid=$(ps-e | grep$!| awk'{print$1}'),以获得pid。你的行返回我标题中的第一个单词,它是pid。你将pid保存在一个文件中,以便稍后杀死它。如果节点停止,另一个进程启动并采用文件中保存的相同pid,该怎么办?你杀了它!
#!/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