在Linux上用forever实现Node.js项目自启动


Posted in Javascript onJuly 09, 2014

那么能否利用forever加启动脚本方式解决上述问题呢?答案当然是肯定的,只不过有点麻烦,而且forever官方缺少详细的配置文档。我在配置的时候也走了一些弯路,下面详细来说。

注:本文的实验环境是Ubuntu Server 12.04 LTS x86_64,在CentOS上的配置更简单一些

最早,我想着试试在/etc/rc.local中增加一句forever start xxx看看,结果发现Ubuntu(其他系统一样)就不鸟我,主要矛盾就是mongodb使用这种方式就可以跑起来,forever就不行,无奈之下,还是从/etc/init.d的角度去考虑吧。

前提是要先把forever好,方法很简单,执行如下命令就好:

npm install forever -g

安装完成后,用一个简单的Node程序测试一下:

forever start test.js
forever stop test.js
forever restart test.js

只要不提示error,就表明forever是可以用的,也就是说用forever来后台开启一个Node项目的基本条件已经具备,剩下的就是来编写一个启动脚本了。

脚本的基本内容如下,感谢原作者的辛勤劳动:

#!/bin/bash
### BEGIN INIT INFO
# Provides:  xiyoulib
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop:  0 1 6
# Short-Description: Start daemon at boot time
# Description:  Enable service provided by daemon.
### END INIT INFO
# chkconfig: 345 88 08
# description: Forever for Node.js

DEAMON=/node.js/XiyouLibNodeExpress/bin/www  #这里需要填写你自己的Node项目的启动脚本文件
LOG=/node.js/log/log #可选,日志文件目录
PID=/node.js/pid #必填内容,用于记录forever的进程号

export PATH=$PATH:/usr/local/bin #在这里指定一下Node的可执行程序安装目录,我的是/usr/local/bin
export NODE_PATH=$NODE_PATH:/usr/local/lib/node_modules #这里是Node类库的路径

#往下的内容就不用修改了

node=node
forever=forever

case "$1" in
 start)
  $forever start -l $LOG --pidFile $PID -a $DEAMON
  ;;
 stop)
  $forever stop --pidFile $PID $DEAMON
  ;;
 stopall)
  $forever stopall --pidFile $PID
  ;;
 restartall)
  $forever restartall --pidFile $PID
  ;;
 reload|restart)
  $forever restart -l $LOG --pidFile $PID -a $DEAMON
  ;;
 list)
  $forever list
  ;;
 *)
  echo "Usage: /etc.init.d/node {start|stop|restart|reload|stopall|restartall|list}"
  exit 1
  ;;
esac

在这里提醒一下:最好为Node项目单独在根目录下建立一个目录,如/node.js,然后权限设为754,这样可以避免一些权限问题而造成的麻烦!

由于用的是Ubuntu Server系统,上面还配置了MongoDB的启动服务,而且在其init.d的脚本中加入了以下的语句:

# Required-Start:  $all
# Required-Stop:   $all

所以在以后自己添加的时候系统会提示错误,所以在Node项目的启动脚本里我加了前面一串的说明注释,以便Ubuntu Server系统进行设置,如果在CentOS上,应该不会出现类似的问题,这点要特别注意!

即以下的说明信息:

### BEGIN INIT INFO
# Provides:     xiyoulib
# Required-Start:  $all
# Required-Stop:   $all
# Default-Start:   2 3 4 5
# Default-Stop:   0 1 6
# Short-Description: Start daemon at boot time
# Description:    Enable service provided by daemon.
### END INIT INFO

脚本编辑完成后使用chkconfig --list指令查看一下自己添加的服务是否生效,即3和5全部要为on才可以实现开机自启动。

如果3和5没有被置为on,那么请执行chkconfig --level 35 [你的服务名] on即可,Ubuntu Server可能会报一些warning,但是只要能将所需设置的服务的3、5变为on,其他的错误可以忽略(我感觉这是系统自己的事)。

设置完成后即可实现Node项目在Linux上的自启动,可以shutdown -r now试一下能否自启,启动好以后直接去访问一下你设定的端口号、虚拟目录神马的,如果出来想要的就大功告成了!

但是如果不对,就好好检查一些脚本,然后根据报错进行相关修改,毕竟我也是试出来的嘛!

Javascript 相关文章推荐
六款帮助你实现惊艳视差滚动效果的jQuery插件
Sep 14 Javascript
最好用的省市二级联动 原生js实现你值得拥有
Sep 22 Javascript
javascript将url中的参数加密解密代码
Nov 17 Javascript
省市二级联动小案例讲解
Jul 24 Javascript
微信小程序 LOL 英雄介绍开发实例
Sep 30 Javascript
Chrome浏览器的alert弹窗禁止再次弹出后恢复的方法
Dec 30 Javascript
关于vue面试题汇总
Mar 20 Javascript
node puppeteer(headless chrome)实现网站登录
May 09 Javascript
JS实现checkbox互斥(单选)功能示例
May 04 Javascript
babel7.x和webpack4.x配置vue项目的方法步骤
May 12 Javascript
js实现图片推拉门效果代码实例
May 18 Javascript
解决Vue watch里调用方法的坑
Nov 07 Javascript
中文输入法不触发onkeyup事件的解决办法
Jul 09 #Javascript
js中将String转换为number以便比较
Jul 08 #Javascript
JS循环遍历JSON数据的方法
Jul 08 #Javascript
jquery获取选中的文本和值的方法
Jul 08 #Javascript
jQuery设置和获取HTML、文本和值示例
Jul 08 #Javascript
jQuery取得设置清空select选择的文本与值
Jul 08 #Javascript
Javascript遍历Html Table示例(包括内容和属性值)
Jul 08 #Javascript
You might like
PHP新手上路(十一)
2006/10/09 PHP
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
PHP array_multisort()函数的使用札记
2011/07/03 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
php多层数组与对象的转换实例代码
2013/08/05 PHP
wamp服务器访问php非常缓慢的解决过程
2015/07/01 PHP
PHP连续签到功能实现方法详解
2019/12/04 PHP
javascript中的void运算符语法及使用介绍
2013/03/10 Javascript
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
JavaScript实现斗地主游戏的思路
2016/02/29 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
jQuery+HTML5实现弹出创意搜索框层
2016/12/29 Javascript
js oncontextmenu事件使用详解
2017/03/25 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
Vue.js实现一个todo-list的上移下移删除功能
2017/06/26 Javascript
React Native使用百度Echarts显示图表的示例代码
2017/11/07 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
2020/07/26 Javascript
python 二分查找和快速排序实例详解
2017/10/13 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
Python数据可视化教程之Matplotlib实现各种图表实例
2019/01/13 Python
详解使用Python下载文件的几种方法
2019/10/13 Python
Python实现钉钉订阅消息功能
2020/01/14 Python
python系统指定文件的查找只输出目录下所有文件及文件夹
2020/01/19 Python
常用python爬虫库介绍与简要说明
2020/01/25 Python
html标签之Object和EMBED标签详解
2013/07/04 HTML / CSS
关于.NET, HTML的五个问题
2012/08/29 面试题
英文翻译的自我评价语句
2013/10/04 职场文书
办公室内勤岗位职责范本
2013/12/09 职场文书
工伤事故赔偿协议书(标准)
2014/09/29 职场文书
大学毕业论文致谢词
2015/05/14 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
小学生家长意见
2015/06/03 职场文书
详解CocosCreator项目结构机制
2021/04/14 Javascript
JavaScript offset实现鼠标坐标获取和窗口内模块拖动
2021/05/30 Javascript
分享几个实用的CSS代码块
2022/06/10 HTML / CSS