【问题标题】:Forever Node JS startup or stop/startingForever Node JS 启动或停止/启动
【发布时间】:2013-12-30 02:26:47
【问题描述】:

我对这一切都很陌生,所以我很抱歉。我的搜索还没有给我答案,我还在测试。

我有一个由 Forever 在 Ubuntu 12.04 LTS 上启动的 Node JS 应用程序。我试图弄清楚的几个要求:

  1. 开机自动启动
  2. 能够手动重启应用

我配置了一个 Upstart 脚本,它运行良好,但我无法正确停止该进程。我认为问题是因为 Upstart 正在寻找一个 PID,而 Forever 创建了一个 PID 但没有告诉 Upstart?所以当我试图停止时,它不知道如何杀死正确的进程。

这是我正在尝试做的一个示例:

#start on startup
#stop on shutdown

expect daemon

env NODE_BIN_DIR=""
env NODE_PATH=""
env APPLICATION_DIRECTORY=""
env APPLICATION_START=""
env NODE_ENV=""

#pre-start script
#sleep 15
#end script

script
    PATH=$NODE_BIN_DIR:$PATH
    cd /vol01/web/iin
    exec sudo -u ubuntu forever -a -l $LOG -e $eLog  start $APPLICATION_START
end script

pre-stop script
    PATH=$NODE_BIN_DIR:$PATH
    exec forever stop $APPLICATION_START
end script

我开始认为解决此问题的最佳方法是在启动时运行一个 cron 作业,该作业将运行一个脚本来运行永久节点。该脚本将包括停止应用程序和启动,我可以手动调用该脚本。想法?

【问题讨论】:

  • 我确实看过那篇文章,但我想我想知道如何永远做到这一点。我喜欢如果 PID 死了就永远重新启动的想法,但我猜暴发户也可以配置为这样做。我还需要弄清楚如何分离应用程序的输出和错误日志。谢谢!
  • 是的!祝你好运。 Forever 会起作用,但我发现最好做别人以前做过的事情。

标签: node.js upstart forever


【解决方案1】:

我使用类似的东西:

#!upstart

description "your fancy description"
author "Your Name <youremail@fqdn>"

# start on every run level, 2 is the one on Ubuntu
start on runlevel [2345]

# stop on halt, maintenance or reboot
stop on runlevel [016]

# start our application with the user `user`
exec sudo -u user -i NODE_ENV=production /path/to/bin/for/forever start /home/user/path/to/server >> /home/user/path/to/server/syslog 2>&1

# starting log
pre-start script
  echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /home/user/path/to/server/syslog 2>&1
end script

如果您想拆分日志、定义自定义 PID 等,您可以使用 forever 的 argv 选项来完成此操作。

如果您希望脚本可以使用 stop|start|restart 等命令,您可以阅读这篇精彩的文章: https://www.exratione.com/2013/02/nodejs-and-forever-as-a-service-simple-upstart-and-init-scripts-for-ubuntu/

【讨论】:

  • 我没有使用运行级别选项 - 这是否也让您能够停止服务?我的“停止”该过程,但是当您检查状态时,它会显示类似 {stopping/waiting, process 123} 的内容。如果我尝试终止进程,状态会显示相同的内容。
  • 查看我为该功能发布的文章
  • 啊,谢谢。当我开始这篇文章时,我已经参考了这篇文章,并且在他发布的两个脚本之间混淆了。将进一步看看。谢谢!