我正在为永远运行的 Node.js 应用程序编写一个初始化脚本。 Forever 本身就是一个守护进程,在其下运行 Node 进程。
我的问题是,当 Node.js 应用程序崩溃时,init 脚本无法捕获该情况,因为永远总是返回 0。
我将永远开始如下:$FOREVER start --pidFile $PIDFILE -al $LOGFILE -ao $OUTFILE -ae $ERRFILE $SERVER
当 Node.js 正常启动并且我做了一个列表时,我得到:
# forever list
info: Forever processes running
data: uid command script forever pid logfile uptime
data: [0] UP0C /usr/bin/node /some/path/here/server.js 27322 27324 /root/.forever/UP0C.log 0:0:6:3.493
当它崩溃时,我看到:
# forever list
info: Forever processes running
data: uid command script forever pid logfile uptime
data: [0] QFel /usr/bin/node /some/path/here/server.js 27578 27580 /root/.forever/QFel.log 0:0:1:6.207
正如您所看到的,几乎没有区别。当我跟踪输出中显示的日志文件时,我看到 Node 抛出的错误。我会在最后看到错误:永远检测到脚本退出,代码为:8
。
检查失败的Node进程的pid,我看到:
# ps aux | grep 27580
root 27671 0.0 0.0 103240 840 pts/0 S+ 18:37 0:00 grep 27580
该进程处于休眠状态。为什么不永远捕获这一点,那个正在 sleep 的进程是什么?为什么它不直接退出?
换句话来说,使用forever,我怎样才能检测到forever尝试运行的进程失败了?为什么永远没有一种简单的方法来管理它?本质上,forever 不就是为了管理 Node 应用程序的启动和停止而设计的吗?检查进程是否实际启动应该是基础功能之一。
最佳答案
您还可以看一下名为 forever 的非 cli 版本:
forever-monitor
https://github.com/nodejitsu/forever-monitor
它提供了订阅所需的所有事件,例如:
error [err]: Raised when an error occurs
start [process, data]: Raised when the target script is first started.
stop [process]: Raised when the target script is stopped by the user
restart [forever]: Raised each time the target script is restarted
exit [forever]: Raised when the target script actually exits (permenantly).
stdout [data]: Raised when data is received from the child process' stdout
stderr [data]: Raised when data is received from the child process' stderr
关于node.js - 永远无法正确显示正在运行的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24394122/