nodejs之不可或缺的forever模块

官方说明
A simple CLI tool for ensuring that a given script runs continuously (i.e. forever).
一个用来持续运行一个给定脚本的简单的命令行工具
Github地址: https://github.com/nodejitsu/forever

作用

forever的用途就是帮我们更好的管理我们的node App服务,本质上就是在forever进程之下,创建一个node app的子进程,保证我们的服务能持续运行,帮我们自动重启服务而不需要手动重启.

安装

forever 必须在全局环境下安装

1
sudo npm install forever -g

常用命令

  • 启动

    1
    forever start app.js
  • 指定forever信息输出文件(默认它会放到~/.forever/forever.log)

    1
    forever start -l forever.log app.js
  • 指定app.js中的日志信息和错误日志输出文件

    1
    2
    3
    //  -o 就是console.log输出的信息,
    // -e 就是console.error输出的信息
    forever start -o out.log -e err.log app.js
  • 追加日志,forever默认是不能覆盖上次的启动日志, 所以如果第二次启动不加-a,则会不让运行

    1
    forever start -l forever.log -a app.js
  • 监听当前文件夹下的所有文件改动

    1
    forever start -w app.js
  • 显示所有运行的服务

    1
    forever list

    输出如下

    1
    2
    3
    4
    [root@oura ~]# forever list
    info: Forever processes running
    data: uid command script forever pid id logfile uptime
    data: [0] qnwC /usr/local/bin/node bin/www 26102 26321 /root/.forever/qnwC.log 0:1:26:10.30
  • 停止守护进程

    1
    2
    3
    4
    forever stop app.js
    //或者
    forever stop [uid]
    //[uid]就是forever list对应查询到的启动服务里的uid(如上面的 qnwC )
  • 停止所有守护进程

    1
    forever stopall
  • 重启某一个服务

    1
    forever restart app.js
  • 重启所有服务

    1
    forever restartall

常见参数配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-m MAX: 运行指定脚本的次数
-l LOGFILE: 输出日志到LOGFILE
-o OUTFILE: 输出控制台信息到OUTFILE
-e ERRFILE: 输出控制台错误在ERRFILE
-p PATH: 根目录
-c COMMAND: 执行命令,默认是node
-a, –append: 合并日志
-f, –fifo: 流式日志输出
-n, –number: 日志打印行数
pidFile: pid文件
sourceDir: 源代码目录
minUptime: 最小spinn更新时间(ms)
spinSleepTime: 两次spin间隔时间
colors: 控制台输出着色
plain: –no-colors的别名,控制台输出无色
-d, –debug: debug模式
-v, –verbose: 打印详细输出
-s, –silent: 不打印日志和错误信息
-w, –watch: 监控文件改变
watchDirectory: 监控顶级目录
watchIgnore: 通过模式匹配忽略监控
-h, –help: 命令行帮助信息

forever 利用别名启动 node 服务

适用场景

当我们所在的测试环境部署了好几个应用,前面用 nginx 做反向代理.
而我们的 node.js 服务器启动文件一般都喜欢用 app.js 或者 index.js.

那么问题就快要出现了.
当如下所示, 有多个同名的启动文件, 并想要去掉其中的某一个node服务时,怎么办?
执行forever stop app.js? 这样只会全部关掉,死无全尸.

1
2
3
4
5
6
7
[root@oura ~]# forever list
info: Forever processes running
data: uid command script forever pid logfile uptime
data: [0] 0D4G /usr/local/bin/node app.js 537 3099 /root/.forever/a.log 3:21:28:21.634
data: [1] FT5X /usr/local/bin/node app.js 1898 1902 /root/.forever/b.log 90:15:23:19.11
data: [2] Cr8D /usr/local/bin/node app.js 2288 4915 /root/.forever/c.log 2:10:2:58.797
data: [3] itbilu /usr/local/bin/node app.js 6893 6895 /root/.forever/d.log 61:21:5:36.54

遇到如上的情况时最好的解决办法就是给每个服务起个独一无二的别名 (别名-其实就是linux下的一个软链接, 也就是给启动文件设置一个软链接).

下面所示的软链接会按数字顺序排列,我们在生产环境中,最好起名和业务相关,便于一眼识别.
进入node服务1目录

1
ln -s ./app.js node_noe

这时在目录下回多出来一个 软链接 node_noe ,然后用 forever 启动它

1
forever start node_noe

依次进入 node 服务2目录 …..设置完后启动,最后你的 forever list 是这样的:

1
2
3
4
5
6
7
[root@oura ~]# forever list
info: Forever processes running
data: uid command script forever pid logfile uptime
data: [0] 0D4G /usr/local/bin/node node_one 537 3099 /root/.forever/a.log 3:21:28:21.634
data: [1] FT5X /usr/local/bin/node node_two 1898 1902 /root/.forever/b.log 90:15:23:19.11
data: [2] Cr8D /usr/local/bin/node node_three 2288 4915 /root/.forever/c.log 2:10:2:58.797
data: [3] itbilu /usr/local/bin/node node_four 6895 /root/.forever/d.log 61:21:5:36.54

这时Leader 再让我们去停止某个业务的 node 服务时,就不必手慌脚乱了.
通过别名一眼识别针对的是哪个服务.然后

1
forever stop node_one

这样就万事大吉了, O(∩_∩)O哈哈~