当Node.js应用程序永远崩溃或永久监视时发送电子邮件

时间:2015-04-04 11:55:33

标签: node.js forever forever-monitor

我使用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 stopallforever restartall这样做非常方便。

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

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

1 个答案:

答案 0 :(得分:2)

我认为您应该 fork 永远的git存储库并在源代码中添加电子邮件通知。这样,您可以在没有其他脚本的情况下永远使用CLI。

如果您不熟悉概念签出:https://help.github.com/articles/fork-a-repo/

看起来像这样的功能have been already requested,但没有太多回复。

使用工作解决方案,您可以将(forked)repo添加到package.json中,也可以通过请求pull来为永久项目做出贡献。也许多亏了你,永远都会有电子邮件通知。