🚫
child processをMacとWindows共通でkillさせる
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することができます。
参考
Discussion