在linux上启动了两个节点实例

时间:2014-08-08 19:42:56

标签: linux node.js cron

我有一个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开头的进程也是如此。当我杀死其中一个时,另一个也死了。

我知道为什么要开始两个流程吗?

1 个答案:

答案 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应用程序启动两次。