我使用forever
来运行我的Node.js服务器,我非常喜欢start
/ stop
/ restart
命令行命令。最近我决定我需要系统向我发送有关所有服务器崩溃的电子邮件。不幸的是,forever
并不支持开箱即用的此类功能。
所以我决定采用forever-monitor
(像forever
这样的工具,但采用程序化方法)和nodemailer
。这是我写的脚本:
var forever = require('forever-monitor');
var nodemailer = require('nodemailer');
var sendmailTransport = require('nodemailer-sendmail-transport');
var transporter = nodemailer.createTransport(sendmailTransport({
path: '/usr/sbin/sendmail'
}));
var error = '';
function sendMail(subject, text) {
var message = {
// sender info
from: '"Server name" <no-reply@example.com>',
// Comma separated list of recipients
to: '"My name" <myemail@example.com>',
// Subject of the message
subject: subject,
// plaintext body
text: text
};
transporter.sendMail(message, function (err) {
if (err) {
console.log('Error during trial email with server error report');
console.log(err);
}
});
}
var child = new (forever.Monitor)('app.js', {
outFile: './logs/stdout.log',
errFile: './logs/stderr.log'
});
child.on('stderr', function (data) {
error += data;
});
// Check for errors every second
setInterval(function () {
if (error) {
sendMail('Your server crashed', error);
error = '';
}
}, 1000);
child.start();
我调用了这个文件start.js
。它所做的只是:使用app.js
生成新进程(forever-monitor
,运行我的Express Web服务器),我监听此子进程的stderr
事件,并将所有错误收集到变量中,然后我每秒检查一次这个变量,如果它没有空,我发送一封电子邮件并清除变量。这段代码工作正常。
现在要启动我的服务器,我需要执行nohup node start.js &
之类的操作。糟糕的是,没有简单的方法来停止或重新启动我的服务器。之前我使用forever stopall
和forever restartall
这样做非常方便。
我的下一个想法是尝试合并forever
和forever-monitor
,所以我尝试像forever start start.js
这样启动服务器。服务器启动就像我想的那样。但重新开始工作已经不再适用了。执行forever stopall
然后forever start start.js
也不起作用。服务器开始抱怨端口已经忙了。我认为这是因为forever
停止start.js
进程,但app.js
生成的子forever-monitor
进程仍然占用了端口。
所以我的问题是:如何运行Node.js服务器,接收有关它崩溃的电子邮件,在崩溃时自动重启,并且可以轻松start
/ stop
/ { {1}}它与restart
命令行实用程序一样吗?解决方案可以使用forever
,forever
或两者,或者您认为可能适用于此类问题的任何库。
答案 0 :(得分:2)
我认为您应该 fork 永远的git存储库并在源代码中添加电子邮件通知。这样,您可以在没有其他脚本的情况下永远使用CLI。
如果您不熟悉概念签出:https://help.github.com/articles/fork-a-repo/
看起来像这样的功能have been already requested,但没有太多回复。
使用工作解决方案,您可以将(forked)repo添加到package.json中,也可以通过请求pull来为永久项目做出贡献。也许多亏了你,永远都会有电子邮件通知。