Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2446846
  • 博文数量: 328
  • 博客积分: 4302
  • 博客等级: 上校
  • 技术积分: 5486
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-01 11:14
个人简介

悲剧,绝对的悲剧,悲剧中的悲剧。

文章分类

全部博文(328)

文章存档

2017年(6)

2016年(18)

2015年(28)

2014年(73)

2013年(62)

2012年(58)

2011年(55)

2010年(28)

分类: JavaScript

2015-04-23 16:02:52

由于个人比较喜欢在 Linux 上使用 service ,所以才有了以下的折腾。

forever 与 supervisor 的选择

其实,在本地开发还是比较喜欢用 supervisor 的,因为命令简单。考虑到服务器上可能会运行多个 node server 实例,因此选择 forever 来做 node 服务的管理。

了解 forever ,戳  了解 supervisor,戳


Step 1

安装 forever
sudo npm install -g forever

(这货依赖不是一般多……)

安装成可以看到安装路径,记下待用。以下是我的服务器环境返回

/usr/local/lib/node_modules
注意:在 CentOS 上安装 nodejs / npm 的方式不同,会得到不同的安装路径:make install 一般在 /usr/local/lib/node_modules;yum install 一般在 /usr/lib/node_modules 。

我的服务器环境是阿里云的VPS,默认竟然没有 make,只好自行安装,并且 512M 的小机器 make 的时候慢出翔来了!Linode 都免费升级 1G 了,阿里云几位老哥们(我就不点名了),你们能不能……(此处省略 n 个字)。这是今天的吐槽点一。


Step 2

创建启动文件
sudo vim /etc/init.d/the_name_you_want

写入内容大致如下:

#!/bin/bash # chkconfig: 345 99 01 # description: forever service

345 是启动级别,99 是启动优先级(序号),01 是关闭优先级(序号)。如果有其他服务依赖于 forever 服务,可以提高优先级,以确保其他服务启动时其可用。

继续:

DEAMON="/your/server/app.js" LOG="/your/logs/file.log" DEAMONPATH="/your/watch/path" PID="/root/.forever/pids/forever.pid"

注意右边是值在引号内!!不然 forever 可能会喊它要 string,尤其是 LOG 地址。在 yum 安装环境中遇到过,make 安装环境未重现,这是今天的吐槽点二。

继续

export PATH=$PATH:/usr/local/bin export NODE_PATH=$NODE_PATH:/usr/local/lib/node_modules

注入环境变量,不然找不到 node 或者 -g 安装的包。上面已经提过,地址根据安装方法不同不一致,区别在于有没有 local 这一级,自己根据实际情况定夺。

继续

case "$1" in start) forever start -wal $LOG -m 0 --watchDirectory $DEAMONPATH --pidFile $PID $DEAMON ;; stop) forever stop --pidFile $PID $DEAMON ;; restart) forever restart -wal $LOG -m 0 --watchDirectory $DEAMONPATH --pidFile $PID $DEAMON ;; list) forever list ;; *) echo "Usage: /etc/init.d/the_name_you_want {start|stop|restart|list}" exit 1 ;; esac exit 0

详细说明一下:

  • -w 监视文件变更,forever 会重启 server 的子进程
  • -l 指定输入日志
  • -a 声明追加内容到已有日志文件 (没有 -a 会直接报错并中断…………谁会每次重新启动来关心 log 日志啊?!为什么 -a 不是默认值!!!这是今天的吐槽点三。
  • -m 最大运行次数
  • --watchDirectory 监视文件的目录 path (这是一个奇葩的设定,不知道是我“打开的方式不对”,还是其他问题。如果设置了 -w 就必须设置一下这货,不然…… 后面用一节来专门说明这个问题。这是今天的吐槽点四。也是最大的吐槽点!!
  • --pidFile 字面意思

list 命令用来查看正在运行的进程,其他命令顾名思义了。

到这里,启动文件创建完成了,可以 :wq 了。


Step 3

确认启动文件的一些属性
sudo chown root:root /etc/init.d/the_name_you_want
sudo chmod 755 /etc/init.d/the_name_you_want
启动服务
sudo chkconfig --add the_name_you_want
chkconfig the_name_you_want on
基本完成

可以通过如下命令来控制服务了

sudo service the_name_you_want start
sudo service the_name_you_want restart
sudo service the_name_you_want stop
sudo service the_name_you_want list 


Step 4

添加忽略监控文件的配置文件
touch /your/watch/path/.foreverignore

吐槽点四!!!

如果没有 .foreverignore 会报一个 error,如下:

error: Could not read .foreverignore file. error: ENOENT, open '/your/watch/path/.foreverignore'

但是你的 app.js 是会正常执行的,应该说一切正常。

而,如果没有 --watchDirectory 参数配置,你仍然会得到一个 error,如下:

error: Could not read .foreverignore file. error: ENOENT, open '/.foreverignore' /usr/local/lib/node_modules/forever/node_modules/forever-monitor/node_modules/watch/main.js:63 if (err) throw err; ^ Error: ENOTDIR, readdir '/proc/1/fd/5'

此时,你的 app.js 依然欢快运行,但是你执行 list 命令去看它的时候,它……

sudo /etc/init.d/noded list
info: No forever processes running

-w 和 --watchDirectory 要一起出现,就够了,-w 不能直接接收值也忍了,不设置后者直接出现这种奇异现象,真是……(此处省略10000字!!)

遇到这种情况,forever 已经找不到你的进程了,可以通过以下两个方法关闭……

cat /root/.forever/pids/forever.pid #返回pid kill #pid sudo killall node

相比同样提供监控功能的 supervisor 就 nice 多了,一句搞定:

supervisor your/path/to/app.js

当然,简单的相应功能少一点,取舍看个人了。

偶尔有兴致搞一下 node,就折腾了半天,真是不吐不快。由于本人功底差,行文产生的错误,望海涵。


转载自:
阅读(2565) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~