Processモジュールの概要
Node.jsはシングルスレッドで動作する非同期型サーバーサイド技術ですが、現代のコンピュータはマルチプロセッサ構成が一般的です。Node.jsでは複数プロセスを管理するための3つのモジュールを提供しています。
- Processモジュール:現在実行中のプロセスにアクセス
- child_processモジュール:子プロセスの作成と通信
- clusterモジュール:ポート共有によるクラスタリング機能
ここでは、プロセス情報を取得し、制御するためのProcessモジュールについて詳しく説明します。
標準入出力の利用
Processオブジェクトは、標準入出力(stdin, stdout, stderr)へのアクセス機能を提供します。これはC++や他の言語における標準I/Oと似たような動作を行います。
process.stdin.on('data', (input) => {
process.stdout.write(`STDOUT: ${input}`);
process.stderr.write(`STDERR: ${input}`);
});
プロセス信号の処理
Node.jsでは、プロセスに対してOSから送られるシグナルを処理することが可能です。以下は主なシグナルの種類です:
- SIGUSR1:デバッガ起動時に送信
- SIGPIPE:切断されたパイプへの書き込み時
- SIGHUP:コンソールが閉じられた時(Windows)
- SIGTERM:プロセス終了要求(Windowsでは非対応)
- SIGINT:Ctrl+C入力時
- SIGBREAK:Ctrl+Break入力時(Windows)
- SIGKILL:プロセス強制終了時
- SIGSTOP:プロセス一時停止時
これらのシグナルは以下のようにイベントリスナーで処理できます:
process.on('SIGINT', () => {
console.log('SIGINT信号を受信しました');
process.exit(0);
});
プロセス操作の制御
Processモジュールにはプロセスを操作するためのメソッドが提供されています:
- abort():abortイベントを発生させ、コアダンプを生成して終了
- exit([code]):指定された終了コードで終了
- kill(pid, [signal]):指定したPIDにシグナルを送信
- nextTick(callback):コールバックを次のイベントループで実行
プロセス情報の取得
Processオブジェクトには、実行中のプロセスに関する詳細な情報が含まれています:
const util = require('util');
console.log(`カレントディレクトリ: ${process.cwd()}`);
console.log(`環境変数: ${JSON.stringify(process.env)}`);
console.log(`コマンドライン引数: ${process.argv.join(', ')}`);
console.log(`Node.js実行パス: ${process.execPath}`);
console.log(`Node.jsバージョン: ${process.version}`);
console.log(`プロセスID: ${process.pid}`);
console.log(`プラットフォーム: ${process.platform}`);
console.log(`アーキテクチャ: ${process.arch}`);
console.log(`メモリ使用量: ${util.inspect(process.memoryUsage())}`);
const start = process.hrtime();
setTimeout(() => {
const delta = process.hrtime(start);
console.log(`高精度タイマー: ${delta[0]}秒 ${delta[1]}ナノ秒`);
console.log(`起動時間: ${process.uptime()}秒`);
}, 1000);