在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 相关文章推荐
escape、encodeURI、encodeURIComponent等方法的区别比较
Dec 27 Javascript
JScript中的"this"关键字使用方式补充材料
Mar 08 Javascript
如何做到打开一个页面,过几分钟自动转到另一页面
Apr 20 Javascript
javascript内存管理详细解析
Nov 11 Javascript
jQuery setTimeout传递字符串参数报错的解决方法
Jun 09 Javascript
JavaScript版的TwoQueues缓存模型
Dec 29 Javascript
jQuery中:checkbox选择器用法实例
Jan 03 Javascript
js中不同的height, top的区别对比
Sep 24 Javascript
使用JS判断移动端手机横竖屏状态
Jul 30 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
Nov 02 Javascript
webpack-mvc 传统多页面组件化开发详解
May 07 Javascript
vue3修改link标签默认icon无效问题详解
Oct 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
用PHP制作静态网站的模板框架(一)
2006/10/09 PHP
IStream与TStream之间的相互转换
2008/08/01 PHP
PHP中的替代语法简介
2014/08/22 PHP
Thinkphp自定义代码生成工具及用法说明(附下载地址)
2016/05/27 PHP
ThinkPHP打水印及设置水印位置的方法
2016/10/14 PHP
Javascript !!的作用
2008/12/04 Javascript
jQuery事件绑定.on()简要概述及应用
2013/02/07 Javascript
上传的js验证(图片/文件的扩展名)
2013/04/25 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
2014/12/18 Javascript
js操作数组函数实例小结
2015/12/10 Javascript
JavaScript 模块的循环加载实现方法
2015/12/13 Javascript
基于javascript实现仿百度输入框自动匹配功能
2016/01/03 Javascript
JavaScript中闭包之浅析解读(必看篇)
2016/08/25 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
Node.js 8 中的 util.promisify的详解
2017/06/12 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
在webstorm开发微信小程序之使用阿里自定义字体图标的方法
2018/11/15 Javascript
详解Vue一个案例引发「内容分发slot」的最全总结
2018/12/02 Javascript
详解Vue-axios 设置请求头问题
2018/12/06 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
在Vue 中获取下拉框的文本及选项值操作
2020/08/13 Javascript
node.js基础知识汇总
2020/08/25 Javascript
如何通过JS实现日历简单算法
2020/10/14 Javascript
Java 生成随机字符的示例代码
2021/01/13 Javascript
[49:28]VP vs Optic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python中的生成器和yield详细介绍
2015/01/09 Python
使用graphics.py实现2048小游戏
2015/03/10 Python
python实现将汉字转换成汉语拼音的库
2015/05/05 Python
利用python读取YUV文件 转RGB 8bit/10bit通用
2019/12/09 Python
Python.append()与Python.expand()用法详解
2019/12/18 Python
CSS3改变浏览器滚动条样式
2019/01/04 HTML / CSS
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
5.1手机促销活动
2014/01/17 职场文书
主婚人致辞精选
2015/07/28 职场文书
《黑岩★★射手 DAWN FALL》BD发售宣传CM公开
2022/04/04 日漫