Node.jsでchild_process.spawn()
メソッドを使用して起動したプロセスをkillした際に送信されるシグナルを確認するためには、以下の手順でシンプルなプログラムを作成することが効果的です:
child_process.spawn()
を使用して外部のプログラムまたはスクリプトを起動します。childProcess.kill([signal])
メソッドを使用して、特定のシグナルを送信することができます。以下はこの手順を実装したサンプルコードです:
const { spawn } = require('child_process');
// 外部プロセスの起動
const child = spawn('node', ['some-script.js']);
// 子プロセスが終了したときのイベントハンドラ
child.on('close', (code, signal) => {
console.log(`子プロセスが終了しました。終了コード: ${code}, シグナル: ${signal}`);
});
// 子プロセスがエラーで終了したときのイベントハンドラ
child.on('error', (err) => {
console.error(`子プロセスがエラーで終了しました: ${err}`);
});
// 特定の時間後に子プロセスをkill
setTimeout(() => {
child.kill('SIGTERM');
}, 5000);
このコードでは、some-script.js
という外部スクリプトを子プロセスとして起動し、5秒後に SIGTERM
シグナルを送信しています。子プロセスは SIGTERM
シグナルを受け取ると終了し、そのシグナルが親プロセスにログとして記録されます。
この方法であれば、最小限の工数で子プロセスがどのシグナルで終了したかを確認することができます。
some-script.js
には、シグナルを受け取った際の挙動を定義する処理が書かれています。このスクリプトはchild_process.spawn()
によって起動された子プロセスとして動作し、特定のシグナル(例えばSIGTERM
)を受け取ったときに、それを検出しログに記録するように設計されます。
以下はsome-script.js
のサンプルコードです:
process.on('SIGTERM', () => {
console.log('SIGTERMを受け取りました。プロセスを終了します。');
process.exit(0);
});
// 他のシグナルに対するハンドラもここに追加することができます
// 例: process.on('SIGINT', () => { ... });
// このスクリプトが特定の長さの時間実行され続けるように、何かしらの処理をループさせます
// 例: setInterval(() => console.log('プロセス実行中...'), 1000);
// 長時間実行する必要がなければ、上記のようなループは不要です
このコードでは、SIGTERM
シグナルを受け取った際にコンソールにメッセージを出力し、プロセスを正常に終了させます。また、他のシグナル(例えばSIGINT
)に対しても同様の処理を追加することができます。