Nodejs
记录在nodejs学习过程中遇到的一些难点、易混点
1.subprocess.kill([signal])
业务场景: 当需要手动杀死子进程且需要在子进程的exit事件中区分是否是手动关闭
采取的方案:使用kill([signal])携带信号的形式,预期在exit的回调中获取到signal,用来标识
遇到的问题:携带的signal为‘SININT’,结果并未在exit回调中获取到对应signal,‘SINKILL’符合预期
结论:😄当传递SIGINT信号时,子进程的exit中获取不到SIGINT,这是因为SIGINT信号的特性,当子进程收到SIGINT信号时,会尝试终止它的执行,但是它可以被捕捉并执行某些操作,而传递SIGKILL信号后,子进程就无法捕捉到这个信号,所以会立即终止它的执行,导致子进程exit事件中能够获取到SIGKILL信号。
const { spawn } = require('node:child_process');
const grep = spawn('grep', ['ssh']);
grep.on('exit', (code, signal) => {
console.log(`${code}----${signal}`);
});
// Send SIGHUP to process.
grep.kill('SIGINT'); // code: 1 signal: null
grep.kill('SIGKILL'); // code: null signal: SIGKILL