在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 相关文章推荐
JavaScript 编程引入命名空间的方法与代码
Aug 13 Javascript
JScript分割字符串示例代码
Sep 04 Javascript
如何设置iframe高度自适应在跨域情况下的可用方法
Sep 06 Javascript
刷新页面的几种方法小结(JS,ASP.NET)
Jan 07 Javascript
javascript中Number对象的toString()方法分析
Dec 20 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
Aug 21 Javascript
jquery把int类型转换成字符串类型的方法
Oct 07 Javascript
Javascript动画效果(2)
Oct 11 Javascript
Angularjs使用指令做表单校验的方法
Mar 31 Javascript
JS闭包可被利用的常见场景小结
Apr 09 Javascript
JS实现的简单tab切换功能完整示例
Jun 20 Javascript
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
Apr 09 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
第十二节 类的自动加载 [12]
2006/10/09 PHP
自动分页的不完整解决方案
2007/01/12 PHP
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
PHP判断表达式中括号是否匹配的简单实例
2016/10/22 PHP
php fread函数使用方法总结
2019/05/28 PHP
学习js在线html(富文本,所见即所得)编辑器
2012/12/18 Javascript
js中arguments,caller,callee,apply的用法小结
2014/01/28 Javascript
js精美的幻灯片画集特效代码分享
2015/08/29 Javascript
AngularJS全局scope与Isolate scope通信用法示例
2016/11/22 Javascript
bootstrap table使用入门基本用法
2017/05/24 Javascript
JavaScript之filter_动力节点Java学院整理
2017/06/28 Javascript
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
2017/10/31 Javascript
JavaScript如何获取一个元素的样式信息
2019/07/29 Javascript
JavaScript数组常用的增删改查与其他属性详解
2020/10/13 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
[02:14]DOTA2英雄基础教程 修补匠
2013/12/23 DOTA
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
Python下线程之间的共享和释放示例
2015/05/04 Python
Django的信号机制详解
2017/05/05 Python
Scrapy的简单使用教程
2017/10/24 Python
Python中使用遍历在列表中添加字典遇到的坑
2019/02/27 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
Python计算IV值的示例讲解
2020/02/28 Python
python中threading开启关闭线程操作
2020/05/02 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
2020/05/26 Python
HTML5地理定位_动力节点Java学院整理
2017/07/12 HTML / CSS
使用canvas压缩图片大小的方法示例
2019/08/02 HTML / CSS
linux比较文件内容的命令是什么
2015/09/23 面试题
校园创业策划书
2014/01/14 职场文书
绿色出行口号
2014/06/18 职场文书
卖车协议书范本4篇
2014/10/01 职场文书
世界地球日活动总结
2015/02/09 职场文书
雷锋之歌观后感
2015/06/10 职场文书
爱国主义影片观后感
2015/06/18 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书
Mysql基础之常见函数
2021/04/22 MySQL