🚫

child processをMacとWindows共通でkillさせる

2024/06/27に公開

child_processを使用して実行したプロセスをkillする方法の備忘録です。

標準的な方法(Mac環境)

child_processの公式ドキュメントでは、以下のようにkill()メソッドを使用してプロセスを終了させることができます。

const { spawn } = require('child_process');

// 処理時間の長いプロセスを実行
const subprocess = spawn('huga.exe');

// 10秒後にプロセスをkill
setTimeout(() => {
  subprocess.kill();
}, 10000);

しかし、この方法はMacでは正常に動作しますが、Windowsではプロセスがkillされません。

Windows環境での対応方法

Windowsの場合は、taskkillコマンドかtree-killパッケージを使用する方法があります。

taskkillを使用する場合

const { spawn, exec } = require('child_process');

// 処理時間の長いプロセスを実行
const subprocess = spawn('huga.exe');

// 10秒後にプロセスをkill
setTimeout(() => {
  exec(`taskkill /pid ${subprocess.pid} /T /F`);
}, 10000);

taskkillコマンドのオプション:

  • /pid: killするプロセスIDをこのオプションの後に指定
  • /T: 指定したプロセスIDの子プロセスもkill
  • /F: プロセスを強制終了

tree-killパッケージを使用する場合

const kill = require('tree-kill');
const { spawn } = require('child_process');

const subprocess = spawn('huga.exe');

// 10秒後にプロセスをkill
setTimeout(() => {
  kill(subprocess.pid);
}, 10000);

MacとWindowsで分岐する方法

const { spawn, exec } = require('child_process');
const os = require('os');

const subprocess = spawn('huga.exe');

if (os.platform() === 'win32') {
  // Windowsの場合
  exec(`taskkill /pid ${subprocess.pid} /T /F`);
} else {
  // Macの場合
  subprocess.kill();
}

この方法を使用することで、MacとWindows両環境で適切にプロセスをkillすることができます。

参考

https://nodejs.org/api/process.html
https://stackoverflow.com/questions/32705857/cant-kill-child-process-on-windows
https://stackoverflow.com/questions/23706055/why-can-i-not-kill-my-child-process-in-nodejs-on-windows

Discussion