首页 > 解决方案 > 子进程的后代未在 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,该脚本在调用时运行SIGTERMyarn 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 机器上接收良好的不同行为。

标签: node.jsjestjswebpack-dev-serverchild-processsigterm

解决方案


推荐阅读