由于个人比较喜欢在 Linux 上使用 service ,所以才有了以下的折腾。
forever 与 supervisor 的选择
其实,在本地开发还是比较喜欢用 supervisor 的,因为命令简单。考虑到服务器上可能会运行多个 node server 实例,因此选择 forever 来做 node 服务的管理。
了解 forever ,戳 https://github.com/nodejitsu/forever
了解 supervisor,戳https://github.com/isaacs/node-supervisor
Step 1
安装 forever
1 | sudo npm install -g forever |
(这货依赖不是一般多……)
安装成功后可以看到安装路径,记下待用。以下是我的服务器环境的返回:1
/usr/local/lib/node_modules
注意:在 CentOS 上安装 nodejs / npm 的方式不同,会得到不同的安装路径:make install 一般在 /usr/local/lib/node_modules;yum install 一般在 /usr/lib/node_modules 。
Step 2
创建启动文件
1 | sudo vim /etc/init.d/the_name_you_want |
启动文件内容
1 | #!/bin/bash |
345 是启动级别,99 是启动优先级(序号),01 是关闭优先级(序号)。如果有其他服务依赖于 forever 服务,可以提高优先级,以确保其他服务启动时其可用。
继续:
1 | DEAMON="/your/server/config/file/path" |
DEAMON 处给出配置文件地址,其中文件内容每行为一项任务,每项形如:
name app.js path/of/app/js两处“xxx”是占位符,稍后替换用;
注意右边是值在引号内!!不然 forever 可能会喊它要 string,尤其是 LOG 地址。在 yum 安装环境中遇到过,make 安装环境未重现。
继续
1 | export PATH=$PATH:/usr/local/bin |
注入环境变量,不然找不到 node 或者 -g 安装的包。上面已经提过,地址根据安装方法不同不一致,区别在于有没有 local 这一级,自己根据实际情况定夺。
继续,start 命令:
1 | case "$1" in |
详细说明一下:
- “Name Main Path” 对应配置文件中的内容格式,
- start 后不跟参数,则启动所有配置项;跟上配置项 Name 做参数则仅启动该项
- 已经启动的返回友好提示信息
关于 forever 的说明:
- -w 监视文件的变更,一旦有变更,forever 会重启关联 server
- -a 声明追加内容到已有日志文件 (没有 -a 重启时会直接报错并中断…………谁会每次重新启动来关心 log 日志?!为什么 -a 不是默认值!!!)
- -l 指定日志文件地址
- -m 最大运行次数
- —watchDirectory 监视文件的目录 path
- —pidFile 字面意思
list 命令用来查看正在运行的进程,其他命令顾名思义了。
继续,stop 命令:
1 | stop) |
说明
- 不需要第二参数
- 显示正在运行的任务列表,输入 uid 号以停止相应任务
继续,stopall、restartall 命令:
1 | stopall) |
很简单,不错解释了。
继续,reload|restart 命令:
1 | reload|restart) |
用法说明
- 必须使用第二参数:任务项的 Name
- reload、restart 互为别名
继续,获取运行任务列表:
1 | list) |
没有命令时:1
2
3
4
5
6 *)
echo "Usage: /etc/init.d/noded {start|stop|restart|reload|stopall|restartall|list}"
exit 1
;;
esac
exit 0
到这里,启动文件创建完成了,可以 :wq 了。
Step 3
确认启动文件的一些属性
1 | sudo chown root:root /etc/init.d/the_name_you_want |
启动服务
1 | sudo chkconfig --add the_name_you_want |
基本完成
可以通过如下命令来控制服务了1
2
3
4sudo 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
其他问题
添加忽略监控文件的配置文件1
touch /your/watch/path/.foreverignore
如果没有 .foreverignore 会报一个 error,如下:1
2error: Could not read .foreverignore file.
error: ENOENT, open '/your/watch/path/.foreverignore'
但是你的 app.js 是会正常执行的,应该说一切正常。
而,如果没有 —watchDirectory 参数配置,你仍然会得到一个 error,如下:1
2
3
4
5
6
7error: 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 命令去看它的时候,它……1
2sudo /etc/init.d/noded list
info: No forever processes running
-w 和 —watchDirectory 要一起出现,就够了,-w 不能直接接收值也忍了,不设置后者直接出现这种奇异现象,真是……(此处省略10000字!!)
End