悲剧,绝对的悲剧,悲剧中的悲剧。
分类: JavaScript
2015-04-23 16:02:52
其实,在本地开发还是比较喜欢用 supervisor 的,因为命令简单。考虑到服务器上可能会运行多个 node server 实例,因此选择 forever 来做 node 服务的管理。
了解 forever ,戳 了解 supervisor,戳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 个字)。这是今天的吐槽点一。
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
详细说明一下:
list 命令用来查看正在运行的进程,其他命令顾名思义了。
到这里,启动文件创建完成了,可以 :wq 了。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
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,就折腾了半天,真是不吐不快。由于本人功底差,行文产生的错误,望海涵。