4

forever用来运行我的 Node.js 服务器,我非常喜欢它的//start命令行命令。最近我决定我需要一个可以通过电子邮件通知我所有服务器崩溃的系统。不幸的是,不支持这种开箱即用的功能。stoprestartforever

所以我决定采用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方便。

我的下一个想法是尝试合并foreverforever-monitor所以我尝试像这样启动服务器forever start start.js。服务器就像我想象的那样启动。但是重新启动不再起作用。执行forever stopall然后forever start start.js也没有用。服务器开始抱怨端口已经很忙。我认为它的发生是因为forever停止start.js了进程,但app.js产生的子进程forever-monitor仍然占用了端口。

所以我的问题是:如何运行 Node.js 服务器,接收有关它崩溃的电子邮件,在它崩溃时自动重新启动它,并有可能像使用命令行实用程序一样轻松地start//它stop?解决方案可以使用,或者两者都使用,或者实际上您认为可能适用于此类问题的任何库。restartforeverforeverforever-monitor

4

1 回答 1

2

我认为您应该fork forever 的 git 存储库并在源代码中添加电子邮件通知。这样,您仍然可以永远使用 CLI,而无需额外的脚本。

如果您不熟悉概念,请查看:https ://help.github.com/articles/fork-a-repo/

似乎已经请求了这样的功能,但没有太多回复。

使用可行的解决方案,您可以将您的(分叉的)repo 添加到您的 package.json 或通过请求 pull 为永久项目做出贡献。也许感谢你永远会有电子邮件通知。

于 2015-05-13T19:40:52.923 回答