解释我的情况。我有一个我运行的pm2 cron脚本:
pm2 start clear-redis-state-cron.js -n clearState --cron '0 0/1 * 1/1 * *'
这会运行名为clear-redis-state-cron.js
的js脚本。
此脚本的作用是停止流程p1
和流程p2
。然后它运行一个lua redis脚本,清除数据库中的一些键。这一切都很好,但为了简洁,我把它放在这里。
var crs = require('./clear-redis-state'),
pm2 = require('pm2');
pm2.connect(function(err) {
pm2.stop('component1');
pm2.stop('component2');
crs.clear();
pm2.restart(__dirname + '/../../node_modules/component1/index.js', { name: 'c1' }, function (err, proc) {
if (err) throw new Error('err');
});
pm2.restart(__dirname + '/../../node_modules/component2/index.js', { name: 'c2' }, function (err, proc) {
if (err) throw new Error('err');
});
});
它运行clear()
js函数,在此处定义:
var config = require('common/lib/config'),
log = require('common/lib/logger'),
redis = require('common/lib/redis'),
ScriptTo = require('redis-scripto');
exports.clear = function() {
log.init();
if (!config.isSet()) {
// Use local config
var configPath = require('path').join(__dirname, '../../app/config');
config.load(configPath);
}
redis.init(config.get('redis'));
var scriptManager = new ScriptTo(redis.getClient());
scriptManager.loadFromDir(__dirname + '/scripts');
scriptManager.run('clear-state', [], [], function(err, results) {
logError(err);
console.log('results:', results);
});
function logError(err) {
if (err !== null) {
console.log('Error loading lua script merge-keys: ', err);
}
};
}
我没有问题。然而,它似乎在开始时崩溃。假设我已经让pm2分别运行两个进程component1和component2,分别叫做p1和p2。当我使用--no-daemon
运行它时,为什么在启动cron时会出现以下错误?
... clear-redis-state-cron.js had too many unstable restarts (15). Stopped. "errored"
我的预感是,进程正在启动错误关闭并且因此处于错误状态,因此当它尝试关闭它时它已经关闭,但是因为pm2假设出现了问题,所以cron进程已停止。 / p>
任何想法我可能做错了什么?
编辑:我尝试了这样的关闭pm2逻辑:
pm2.connect(function(err) {
Promise.resolve(ops.stop('component1'))
.then(ops.stop('component2'))
.then(ops.clear)
.then(ops.restart(__dirname + '/../../node_modules/component1/index.js', { name: 'component1' }))
.then(ops.restart(__dirname + '/../../node_modules/component2/index.js', { name: 'component2' }))
.catch(logFailureToStop);
});
var logFailureToStop = function (err) {
console.log('Failed to stop ', err);
};
在停止正在运行的进程后执行以下结果:
$ pm2 list
┌───────────┬────┬──────┬───────┬─────────┬───────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ PID │ status │ restarted │ uptime │ memory │ watching │
├───────────┼────┼──────┼───────┼─────────┼───────────┼────────┼─────────────┼──────────┤
│ component2│ 0 │ fork │ 0 │ stopped │ 17 │ 0 │ 0 B │ disabled │
│ component1│ 1 │ fork │ 18769 │ online │ 31 │ 19s │ 30.539 MB │ disabled │
答案 0 :(得分:3)
管理最终解决此问题。
问题是因为我有一个on handler处理器事件正在侦听SIGTERM。显然这些会干扰PM2,因此您需要使用gracefulStop / gracefulRestart命令。