Node.jsにて。child_process.spawn()メソッドで起動したプロセスをkillした時にプロセスに送られるシグナルを証明するプログラムを作成し...

❓ プロンプト

💬 回答

Node.jsでchild_process.spawn()メソッドを使用して起動したプロセスをkillした際に送信されるシグナルを確認するためには、以下の手順でシンプルなプログラムを作成することが効果的です:

  1. 子プロセスの作成: child_process.spawn()を使用して外部のプログラムまたはスクリプトを起動します。
  2. シグナルハンドラの設定: 子プロセス内で特定のシグナルを受け取った際に動作するハンドラを設定します。これにより、特定のシグナルを受け取ったことを確認できます。
  3. 子プロセスのkill: 親プロセスから子プロセスをkillします。childProcess.kill([signal]) メソッドを使用して、特定のシグナルを送信することができます。
  4. ログの出力: 子プロセスが終了したときのシグナルをログに記録します。

以下はこの手順を実装したサンプルコードです:

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にはどのような処理が書かれていますか?

❓ プロンプト

💬 回答

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)に対しても同様の処理を追加することができます。