我有一个node.js服务器应用程序由于某种原因正在启动两次。我有一个每分钟运行的cronjob,检查node main.js
进程,如果没有找到,则启动它。 cron看起来像这样:
* * * * * ~/startmain.sh >> startmain.log 2>&1
startmain.sh
文件如下所示:
if ps -ef | grep -v grep | grep "node main.js" > /dev/null
then
echo "`date` Server is running."
else
echo "`date` Server is not running! Starting..."
sudo node main.js > main.log
fi
存储startmain.js
输出的日志文件显示:
Fri Aug 8 19:22:00 UTC 2014 Server is running.
Fri Aug 8 19:23:00 UTC 2014 Server is running.
Fri Aug 8 19:24:00 UTC 2014 Server is not running! Starting...
Fri Aug 8 19:25:00 UTC 2014 Server is running.
Fri Aug 8 19:26:00 UTC 2014 Server is running.
Fri Aug 8 19:27:00 UTC 2014 Server is running.
这就是我的期望,但是当我看到流程时,似乎有两个正在运行。一个在sudo下,一个没有。查看前两个流程:
$ ps -ef | grep node
root 99240 99232 0 19:24:01 ? 0:01 node main.js
root 99232 5664 0 19:24:01 ? 0:00 sudo node main.js
admin 2777 87580 0 19:37:41 pts/1 0:00 grep node
实际上,当我查看应用程序日志时,我看到启动条目一式两份发生。要杀死这些进程,我必须使用sudo
,即使对于不以sudo
开头的进程也是如此。当我杀死其中一个时,另一个也死了。
我知道为什么要开始两个流程吗?
答案 0 :(得分:0)
首先,您在脚本node main.js
中使用sudo
开始startmain.sh
申请。根据{{3}}:
当sudo运行命令时,它调用fork(2),如上所述设置执行环境,并在子进程中调用execve系统调用。主sudo进程等待命令完成,然后将命令的退出状态传递给安全策略的close方法并退出。
因此,在您的情况下,名为sudo node main.js
的进程是sudo
命令本身,进程node main.js
是node.js应用程序。您可以轻松验证这一点 - 运行ps auxfw
,您会看到sudo node main.js
进程是node main.js
的父进程。
验证这一点的另一种方法是运行lsof -p [process id]
,并看到流程txt
的{{1}}部分列出sudo node main.js
/usr/bin/sudo
部分流程txt
将显示node main.js
二进制文件的路径。
最重要的是,您不必担心node.js应用程序启动两次。