【问题标题】:Two instances of node started on linuxlinux上启动的两个node实例
【发布时间】:2014-10-02 09:12:10
【问题描述】:

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

知道我为什么要启动两个进程吗?

【问题讨论】:

  • 你在使用节点集群功能吗?

标签: linux node.js cron


【解决方案1】:

首先,您在脚本startmain.sh 中使用sudo 启动node main.js 应用程序。根据sudo man page

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] 并查看进程sudo node main.jstxt 部分状态/usr/bin/sudo,而进程txt 的部分node main.js 将显示您的路径node二进制。

最重要的是,您不必担心您的 node.js 应用会启动两次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多