在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 smipleChart 简单图标类
Jan 12 Javascript
深入了解javascript中的prototype与继承
Apr 14 Javascript
JavaScript实现多个重叠层点击切换效果的方法
Apr 24 Javascript
Angular 理解module和injector,即依赖注入
Sep 07 Javascript
浅谈JavaScript的计时器对象
Dec 26 Javascript
在微信小程序里使用watch和computed的方法
Aug 02 Javascript
Vue 重置组件到初始状态的方法示例
Oct 10 Javascript
如何使用 vue + d3 画一棵树
Dec 03 Javascript
ES6知识点整理之模块化的应用详解
Apr 15 Javascript
详解js根据百度地图提供经纬度计算两点距离
May 13 Javascript
js实现div色块碰撞
Jan 16 Javascript
js实现从右往左匀速显示图片(无缝轮播)
Jun 29 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时区转换转换函数
2014/01/07 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
2016/09/22 PHP
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
javascript编程起步(第六课)
2007/02/27 Javascript
Javascript-Mozilla和IE中的一个函数直接量的问题分析
2007/08/12 Javascript
jQuery AnythingSlider滑动效果插件
2010/02/07 Javascript
用Javascript来生成ftp脚本的小例子
2013/07/03 Javascript
JavaScript实现复制功能各浏览器支持情况实测
2013/07/18 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
JavaScript函数的调用以及参数传递
2015/10/21 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
2016/06/07 Javascript
jQuery实现可展开折叠的导航效果示例
2016/09/12 Javascript
jQuery实现获取元素索引值index的方法
2016/09/18 Javascript
详解nodejs微信公众号开发——5.素材管理接口
2017/04/11 NodeJs
jquery实现图片上传前本地预览
2017/04/28 jQuery
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
Canvas实现微信红包照片效果
2018/08/21 Javascript
vue element-ui之怎么封装一个自己的组件的详解
2019/05/20 Javascript
uniapp开发小程序实现滑动页面控制元素的显示和隐藏效果
2020/12/10 Javascript
django+js+ajax实现刷新页面的方法
2017/05/22 Python
Python爬虫番外篇之Cookie和Session详解
2017/12/27 Python
使用apidocJs快速生成在线文档的实例讲解
2018/02/07 Python
python实现自动化上线脚本的示例
2019/07/01 Python
Python OpenCV视频截取并保存实现代码
2019/11/30 Python
python实现加密的方式总结
2020/01/19 Python
Python使用内置函数setattr设置对象的属性值
2020/10/16 Python
使用HTML5捕捉音频与视频信息概述及实例
2018/08/22 HTML / CSS
HTML5本地数据库基础操作详解
2016/04/26 HTML / CSS
对于没有初始化的变量的初始值可以作怎样的假定
2014/10/12 面试题
杭州-DOTNET笔试题集
2013/09/25 面试题
三维科技面试题
2013/07/27 面试题
学生自我鉴定范文
2013/10/04 职场文书
酒店门卫岗位职责
2013/12/29 职场文书
工作态度不端正检讨书
2014/10/04 职场文书
催款函怎么写
2015/06/24 职场文书