我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
运行我的 Express Web 服务器)forever-monitor
,我监听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
?解决方案可以使用,或者两者都使用,或者实际上您认为可能适用于此类问题的任何库。restart
forever
forever
forever-monitor