0

我在树莓派工作,节点版本是“node-v0.10.28-linux-arm-pi”。我已经运行了下面的代码。

    '使用严格'
    var util = require('util');
    var config = require('./config.js');
    var fs = 需要('fs');

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

    process.on('退出', 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) {
    //如果(错误)
    //console.log(err);
    //});

    process.stdin.resume();

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

4

2 回答 2

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上的孤立进程组部分。

于 2016-05-02T08:08:13.630 回答
0

那是因为之后立即systemd发送(请参阅SIGKILLSIGTERMshutdown.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 之前有多少时间

于 2015-10-27T12:45:47.437 回答