我在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并退出。 我不知道为什么。 你可以帮我吗? 谢谢。
答案 0 :(得分:0)
这是因为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);
您可能还想阅读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上的孤立进程组部分。