Linux 从nohup+;获取pid和返回状态;苏多
我有一个shell片段: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脚本中获得节点服务器
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