Я не могу захватить SIGTERM, когда использую sudo shutdown -h в node.js

Я работаю над 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 и выйти. Я не знаю почему. Может, Помогите мне, пожалуйста? Спасибо.


person Community    schedule 27.10.2015    source источник


Ответы (2)


Это потому, что systemd отправляет SIGKILL сразу после SIGTERM (см.

Вы также можете прочитать Сколько времени до SIGKILL

person Juicy Scripter    schedule 27.10.2015
comment
Спасибо. Вы имеете в виду, что я всегда не могу запечатлеть событие SIGTERM? - person ; 27.10.2015

Я предполагаю, что вы запускаете скриптовый движок в Терминале.

Во время выключения управляющий терминал закрывается, а процессу сценария отправляются 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.

person Michael Meier    schedule 02.05.2016