我使用forever
運行我的Node.js服務器,我非常喜歡它的start
/stop
/restart
命令行命令。最近我決定需要一個能夠向我發送有關所有服務器崩潰的系統。不幸的是forever
不支持這種開箱即用的功能。發送電子郵件時,直到永遠或Node.js的應用程序崩潰永遠顯示器
所以我決定採取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" <[email protected]>',
// Comma separated list of recipients
to: '"My name" <[email protected]>',
// 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
,它運行我的快速Web服務器)與forever-monitor
,我聽這個子進程的stderr
事件並收集所有錯誤到變量,然後我每秒鐘檢查這個變量,如果它不' t空我發送一封電子郵件並清除變量。此代碼工作正常。
現在開始我的服務器,我需要執行一些像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服務器,接收有關它的崩潰電子郵件,自動重新啓動它時,它墜毀,並有像forever
命令行實用程序可能很容易start
/stop
/restart
呢?解決方案可以使用forever
,forever-monitor
或兩者,或者實際上任何您認爲可能適用於此類問題的庫。