node.js - 子进程的后代未在 ubuntu 上接收 SIGTERM 但在 mac 上接收
问题描述
所以我有一些代码在生成的子进程中运行命令。我使用execa模块执行此操作。
const childProcess = execa.command('yarn start');
const localhostStarted = await waitForLocalhost({ port: 8000 });
expect(localhostStarted.done).toBe(true);
childProcess.kill('SIGINT', { forceKillAfterTimeout: 2000 });
该yarn start
命令webpack-dev-server
在它自己的另一个子进程中执行。但是,当我杀死childProcess
我产生的那个时,它不会自动杀死它产生的webpack-dev-server
进程。众所周知,这里有一个问题https://github.com/webpack/webpack-dev-server/issues/2168。
为了解决这个问题,我在我的脚本中添加了手动侦听器SIGINT
,该脚本在调用时运行SIGTERM
yarn start
['SIGINT', 'SIGTERM'].forEach((signal) => {
console.log('registering events');
process.on(signal, () => {
console.log('received signal', signal);
devServer.close(() => {
console.log('exiting proces');
process.exit(0);
});
});
});
这解决了我的本地机器上的问题,当我杀死我产生的子进程时,它也会杀死它的所有后代,即 dev-server 进程。
但是,此修复程序仍然不适用于 CI,并且由于子进程在 CI 上被杀死,而不是 dev-server 进程,因此我的测试不会退出并一直挂起。
我的本地机器OSX 10.15
在 CI 上,但我们使用ubuntu
. 如果我将 CI 更改为 use macos 10.15
,那么该修复程序也适用于 CI。
我无法找到有关此问题的任何文档,这些文档解释了为什么ubuntu 机器上SIGTERM
的进程未接收到信号dev-server
但在 mac 机器上接收良好的不同行为。