在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 相关文章推荐
RGB颜色值转HTML十六进制(HEX)代码的JS函数
Apr 25 Javascript
Jquery下:nth-child(an+b)的使用注意
May 28 Javascript
使用js 设置url参数
Jul 08 Javascript
javascript中call和apply方法浅谈
Sep 27 Javascript
用javascript实现自动输出网页文本
Jul 30 Javascript
jQuery动画显示和隐藏效果实例演示(附demo源码下载)
Dec 31 Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
Jul 10 Javascript
JavaScript监听手机物理返回键的两种解决方法
Aug 14 Javascript
JavaScript函数绑定用法实例分析
Nov 14 Javascript
vue-cli常用设置总结
Feb 24 Javascript
详解Node.js读写中文内容文件操作
Oct 10 Javascript
vue之debounce属性被移除及处理详解
Nov 13 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
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
我的论坛源代码(六)
2006/10/09 PHP
php实现快速排序的三种方法分享
2014/03/12 PHP
php+jQuery+Ajax简单实现页面异步刷新
2016/08/08 PHP
PHP实现QQ快速登录的方法
2016/09/28 PHP
jQuery中的bind绑定事件与文本框改变事件的临时解决方法
2010/08/13 Javascript
js显示时间 js显示最后修改时间
2013/01/02 Javascript
jQuery中prop()方法用法实例
2015/01/05 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
2015/04/21 Javascript
C#中使用迭代器处理等待任务
2015/07/13 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
2015/10/09 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
2017/03/09 Javascript
JavaScript手风琴页面制作
2017/05/17 Javascript
vue-cli axios请求方式及跨域处理问题
2018/03/28 Javascript
解决vue组件props传值对象获取不到的问题
2019/06/06 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
2019/11/04 Javascript
vue请求数据的三种方式
2020/03/04 Javascript
javascript this指向相关问题及改变方法
2020/11/19 Javascript
PHP webshell检查工具 python实现代码
2009/09/15 Python
python算法学习之桶排序算法实例(分块排序)
2013/12/18 Python
举例讲解Python面相对象编程中对象的属性与类的方法
2016/01/19 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
2018/04/28 Python
python程序实现BTC(比特币)挖矿的完整代码
2021/01/20 Python
css3 iphone玻璃透明气泡完美实现
2013/03/20 HTML / CSS
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
英国在线汽车和面包车零件商店:Car Parts 4 Less
2018/08/15 全球购物
大学生学习党课思想汇报
2014/01/03 职场文书
劳动实践课感言
2014/02/01 职场文书
物业管理毕业生的自我评价
2014/02/17 职场文书
护士求职自荐信范文
2014/03/19 职场文书
农民工工资承诺书范文
2014/03/31 职场文书
2015国庆节感想
2015/08/04 职场文书
(开源)微信小程序+mqtt,esp8266温湿度读取
2021/04/02 Javascript
Python标准库之typing的用法(类型标注)
2021/06/02 Python
配置nginx 重定向到系统维护页面
2021/06/08 Servers