当我在node.js中使用sudo shutdown -h时,我无法捕获SIGTERM

时间:2015-10-27 12:16:38

标签: node.js shutdown sigterm

我在raspberry pi工作,节点版本是" node-v0.10.28-linux-arm-pi"。 我已运行以下代码。

    'use strict'
    var util = require(‘util’);
    var config = require(‘./config.js’);
    var fs = require(‘fs’);

    var pidInfo = util.format('process id:%d’, process.pid);
    util.log(pidInfo);
    process.title = pidInfo;

    process.on('exit’, function () {
    var path = '/home/pi/test/message_1.txt’;
    fs.writeFileSync(path, new Date().toString());
    });

    process.on('SIGTERM’, function () {
    var path = '/home/pi/test/message.txt’;
    fs.writeFileSync(path, new Date().toString());
    process.exit(0);
   });

    //var exec = require(‘child_process’).exec;
    //exec(util.format('sudo shutdown -h %s’, '18:25'), function (err) {
    //if (err)
    //console.log(err);
    //});

    process.stdin.resume();

当我调用linux命令" kill process id"杀死进程,事件SIGTERM和退出被触发。 但是当它运行代码" exec(util.format(' sudo shutdown -h ......" Raspberry pi将直接关闭,我无法捕获事件SIGTERM并退出。 我不知道为什么。 你可以帮我吗? 谢谢。

2 个答案:

答案 0 :(得分:0)

这是因为systemdSIGKILL之后立即发送SIGTERM(请参阅shutdown.c

    log_info("Sending SIGTERM to remaining processes...");
    broadcast_signal(SIGTERM, true, true);

    log_info("Sending SIGKILL to remaining processes...");
    broadcast_signal(SIGKILL, true, false);

您可能还想阅读How much time before SIGKILL

答案 1 :(得分:0)

我假设您在终端中启动脚本引擎。

在关闭期间,控制终端关闭,SIGHUP和SIGCONT被发送到脚本进程。 SIGCONT的默认操作只是继续执行。但是,SIGHUP的默认操作会终止进程,然后才能执行脚本化的SIGTERM处理程序。

在实现SIGHUP处理程序或将SIGHUP处理程序设置为SIG_IGN之后,SIGTERM处理程序应该在关闭期间执行正常。

此示例脚本演示了所有3个信号的接收(SIGHUP,SIGCONT和SIGTERM)。

'use strict'
var fs = require('fs');
var path = '/home/pi/test/message.txt';

fs.writeFileSync(path, new Date().toString() + ': Start\n');

process.on('exit', function () {
    fs.appendFileSync(path, new Date().toString() + ': exit\n');
});

process.on('SIGTERM', function () {
    fs.appendFileSync(path, new Date().toString() + ': SIGTERM\n');
    // delay exit() for academic purposes only
    // without delay SIGHUP and SIGCONT can be missed, which
    // would be OK for the application
    setTimeout( function () {
        process.exit(0);
    }, 5000);
});

// Imlementing SIGHUP handler prevents process termination
// by default SIGHUP handler
process.on('SIGHUP', function () {
    fs.appendFileSync(path, new Date().toString() + ': SIGHUP\n');
});

// SIGCONT handler for academic purposes only
// The default handler SIGCONT would not do any harm
process.on('SIGCONT', function () {
    fs.appendFileSync(path, new Date().toString() + ': SIGCONT\n');
});

var exec = require('child_process').exec;
exec('sudo shutdown -r');

process.stdin.resume();

文件 /home/pi/test/message.txt 的输出示例:

Mon May 02 2016 07:43:52 GMT+0000 (UTC): Start
Mon May 02 2016 07:44:52 GMT+0000 (UTC): SIGTERM
Mon May 02 2016 07:44:52 GMT+0000 (UTC): SIGCONT
Mon May 02 2016 07:44:52 GMT+0000 (UTC): SIGHUP
Mon May 02 2016 07:44:52 GMT+0000 (UTC): SIGHUP
Mon May 02 2016 07:44:57 GMT+0000 (UTC): exit

有关此主题的更多信息,请参阅http://www.win.tue.nl/~aeb/linux/lk/lk-10.html#ss10.2上的孤立进程组部分。