【发布时间】:2023-03-22 08:44:01
【问题描述】:
考虑以下代码:
import {spawn, exec} from 'child_process';
var child = spawn('su',
[process.env.USER, '-c', 'while (true); do sleep 0.3; echo "tick"; done'],
{stdio: ['ignore', 'pipe', 'pipe']}
);
child.stdout.pipe(process.stdout);
child.stderr.pipe(process.stderr);
setTimeout(() => {
child.kill();
}, 1000);
在这里,我正在尝试运行运行其他子进程的特定脚本(在该示例中,su 将产生一个bash 进程)并将其全部关闭。但是,我无法让它按我的预期工作。
调用child.kill() 只会杀死su 的父进程,而不是它的子进程bash。
可以做些什么来让它工作——调用exec(`pkill -TERM -P ${child.pid}`)而不是child.kill()。据我了解,这将杀死父级child.pid 的整个进程树。
然而,将两种方法结合在一起时会有些奇怪:
setTimeout(() => {
child.kill();
exec(`pkill -TERM -P ${child.pid}`);
}, 1000);`
即使在进程被杀死后,此代码也会继续将tick 写入控制台。
为什么会这样?谁能解释一下?
【问题讨论】:
标签: node.js process child-process spawn