2

So I have some code which runs a command in a spawned child process. I do this using the execa module.

      const childProcess = execa.command('yarn start');
      const localhostStarted = await waitForLocalhost({ port: 8000 });
      expect(localhostStarted.done).toBe(true);
      childProcess.kill('SIGINT', { forceKillAfterTimeout: 2000 });

The yarn start command executes webpack-dev-server in another child process of its own. However when I kill the childProcess that I spawned, it does not automatically kill its spawned webpack-dev-server process. It is known to be an issue here https://github.com/webpack/webpack-dev-server/issues/2168.

To fix this I add manual listeners for SIGINT & SIGTERM inside my script which runs when yarn start is called

    ['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);
        });
      });
    });

This fixes the issue on my local machine and when I kill child process I spawn, it kills all its descendents i.e the dev-server process too.

However, this fix still does not work on CI, and since the child process gets killed on CI but not the dev-server process, my tests dont exit and keeps hanging.

My local machine is OSX 10.15 but on CI we use ubuntu. If I change CI to use macos 10.15, then the fix works on CI too.

I am unable to find any docs on this issue which explains the different behaviour on why the signal of SIGTERM is not received by the dev-server process on ubuntu machines but receives fine on mac machines.

Zameer Haque
  • 394
  • 4
  • 24

0 Answers0