2

我编写了一个简单的 bash 脚本,每当提交时自动将代码部署到我的 Node.js 服务器,然后使用永远重新启动服务器。此脚本在 cronjob 上定期运行。哦,是的,该站点在发布之前仍处于开发阶段,因此服务器不断重启。:)

该脚本还做了一些其他的事情,但真正有趣的部分是以下两行代码:

forever stopall
forever start app.js

当我自己从命令行手动运行脚本时,这两个命令会出现以下输出:

Stopping all node jobs
info:    Forever stopped processes:
data:        uid  command             script forever pid   logfile                          uptime
data:    [0] ev5a /usr/local/bin/node app.js 17482   17484 /home/ec2-user/.forever/ev5a.log 0:0:13:17.967
Starting up node server again
info:    Forever processing file: app.js

但是,当作业通过 cron 自动运行时,会输出以下内容:

Stopping all node jobs
^[[32minfo^[[39m:    No forever processes running
Starting up node server again
^[[32minfo^[[39m:    Forever processing file: ^[[90mapp.js^[[39m

这对我来说真的很奇怪。看来,当脚本通过 cron 运行时,Forever 似乎认为在尝试 stopall 时甚至没有任何 Node 进程正在运行。我知道 Node 进程正在运行,所以不知道为什么会出现这种情况。看来这两种运行方法之间应该没有区别。两个脚本都以同一用户身份运行。有谁知道为什么永远的行为如此奇怪?

4

2 回答 2

1

forever通常仅限于当前用户拥有的进程。如果触发 cron 作业的用户不是最初启动该进程的用户,那么forever stopall将找不到任何要杀死的 PID。

例如,我使用名为“nodejs”的用户执行所有节点应用程序。如果我以交互方式使用系统,我可以使用sudo -H -u nodejs forever list. 在 root crons 或 /etc/rc.local 上,我将使用su - nodejs -c "forever start /path/to/app.js"

于 2013-06-27T21:05:39.673 回答
0

我尚未对其进行测试,但您可能想研究一些永远的选项,例如 --exitcrash 标志。

Forever 在处理自动重启服务器的其他程序时会出现问题。虽然不是特定于 Chron,但此链接可能会有所帮助。

于 2013-03-07T20:17:46.117 回答