Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何运行pm2 cron作业而不关心其启动的进程是否已启动?_Javascript_Cron_Pm2 - Fatal编程技术网

Javascript 如何运行pm2 cron作业而不关心其启动的进程是否已启动?

Javascript 如何运行pm2 cron作业而不关心其启动的进程是否已启动?,javascript,cron,pm2,Javascript,Cron,Pm2,来解释我的情况。我有一个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-stat

来解释我的情况。我有一个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已经运行了两个进程,分别是组件1和组件2,分别称为p1和p2。为什么在使用
--无守护进程运行cron时启动cron时会出现以下错误

... clear-redis-state-cron.js had too many unstable restarts (15). Stopped. "errored"
我的直觉是,要么进程开始错误地关闭,结果是处于错误的状态,因此当它试图关闭它时,它已经关闭了,但由于pm2假设出现了问题,cron进程停止

你知道我做错了什么吗

编辑:我试着承诺我的关闭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 │

最终设法解决了这个问题

问题的原因是我有一个on处理程序事件监听SIGTERM。显然,这些会干扰PM2,因此您需要改用gracefulStop/gracefulRestart命令

见: