我们正在使用一台Ubuntu 18.04
服务器来pm2
安排node.js
启动时启动后端,并有一个工作nodemailer
脚本,该脚本向我们的团队成员发送一封电子邮件,其中包含服务器上某些资源的状态。
如果使用 手动启动,此脚本将有效node script.js
。如果使用 启动,pm2 start script.js
它将持续发送电子邮件而不会停止。我认为这是因为pm2
在脚本完成后重新启动脚本可以保持其正常运行。经过一番搜索,我找到了该--no-restart
选项,我只需使用 运行一次即可
`pm2 start script.js --no-autorestart`
由于目标是每天 09:00 发送电子邮件,并且pm2
具有集成cron
功能,因此我尝试运行
pm2 start reportOfflineDevices.js --no-autorestart --cron "0 9 * * *"
但它没有发送任何电子邮件。经过进一步搜索,我发现它pm2
仅使用其cron
功能来重新启动正在运行的进程。由于我包含了该--no-autorestart
选项,因此在它运行一次后,它被列为pm2 status
已停止,因此不会重新启动。
最后,我尝试了一种简单的方法,while(1);
在脚本末尾添加一个以使其保持运行,但它甚至不会发送电子邮件,并top
显示脚本占用了 100% 的 CPU 资源。事后看来,我想这是有道理的……
最后,我要么找到一种方法来保持脚本正常运行而不消耗 CPU 资源,要么忘掉它pm2
,只使用普通的旧版本cron
。您觉得呢?
我在这里发布了我的脚本的简化的最小工作示例(如果在传输器中配置了正确的服务器和身份验证)。
const fetch = require("node-fetch");
const moment = require('moment');
const nodemailer = require('nodemailer');
const report = async () => {
var transporter = nodemailer.createTransport({
auth: {
user: '[email protected]',
pass: 'password'
},
host: 'our.server.blabla',
port: 465,
secure: true
});
var sendToEngineering = {
from: '[email protected]',
to: '[email protected]',
subject: 'Report',
text: "report"
};
transporter.sendMail(sendToEngineering, function (error, info) {
if (error) {
return error;
} else {
return 'Email sent: ' + info.response;
}
});
}
report();
答案1
看起来真的很有趣,但我要做的是将其创建为一个快速应用程序并添加 node-cron 包,然后您可以按如下方式更改代码:
const fetch = require("node-fetch");
const moment = require('moment');
const nodemailer = require('nodemailer');
const express = require("express");
const cron = require("node-cron");
// setup your express server as an app
var app = express();
const report = async () => {
var transporter = nodemailer.createTransport({
auth: {
user: '[email protected]',
pass: 'password'
},
host: 'our.server.blabla',
port: 465,
secure: true
});
var sendToEngineering = {
from: '[email protected]',
to: '[email protected]',
subject: 'Report',
text: "report"
};
transporter.sendMail(sendToEngineering, function (error, info) {
if (error) {
return error;
} else {
return 'Email sent: ' + info.response;
}
});
}
// start scheduling the execution of your function on a daily basis use
// https://crontab.guru to determine your timings
// don't forget that these times are ofcourse based on the server times so you need
// to change it for your timezone
cron.schedule("0 8 * * *, function() {
report();
});
app.listen(3129);
// next line is to ensure it executes atleast once when restarting pm2
report();
这样,您的报告功能应该每天执行一次,如果您的服务器/应用程序需要更新,您可以轻松重新启动服务器并接收邮件以确保没有问题。