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

Я работаю над raspberry pi, и версия узла - это "node-v0.10.28-linux-arm-pi". Я запустил приведенный ниже код.

    'используйте строгое'
    var util = require('util');
    var config = require('./config.js');
    var fs = require('fs');

    var pidInfo = util.format('идентификатор процесса:%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 ответа

Это потому что systemd посылает SIGKILL незамедлительно после 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);

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

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

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

Другие вопросы по тегам