Node.jsでspawnモジュールを使って子プロセスを生成し、端末出力をリアルタイムで取得する方法
Node.jsで子プロセスを生成し、端末出力をリアルタイムで取得する方法
spawnモジュールのインポート
まず、spawn
モジュールをプロジェクトにインポートする必要があります。
const { spawn } = require('child_process');
子プロセスの生成
spawn
関数を使用して、子プロセスを生成します。引数として、実行するコマンドとオプションを指定します。
const childProcess = spawn('ls', ['-l']);
この例では、ls
コマンドを実行し、詳細な一覧表示 (-l
) をオプションとして指定しています。
出力の取得
子プロセスから出力を読み取るには、stdout
イベントリスナーを使用します。
childProcess.stdout.on('data', (data) => {
console.log(data.toString());
});
このコードは、子プロセスから生成されるすべてのデータを出力コンソールに表示します。
エラー処理
子プロセスからエラーが発生した場合は、stderr
イベントリスナーを使用して処理できます。
childProcess.stderr.on('data', (data) => {
console.error(data.toString());
});
子プロセスが終了したら、exit
イベントが発行されます。このイベントを使用して、クリーンアップ処理を実行できます。
childProcess.on('exit', (statusCode) => {
if (statusCode !== 0) {
console.error(`子プロセスが終了しました。終了ステータス: ${statusCode}`);
}
});
このコードは、子プロセスの終了ステータスをチェックし、エラーが発生した場合はエラーメッセージを出力します。
例
以下の例は、ls
コマンドを実行し、その出力をリアルタイムで表示する Node.js スクリプトです。
const { spawn } = require('child_process');
const childProcess = spawn('ls', ['-l']);
childProcess.stdout.on('data', (data) => {
console.log(data.toString());
});
childProcess.stderr.on('data', (data) => {
console.error(data.toString());
});
childProcess.on('exit', (statusCode) => {
if (statusCode !== 0) {
console.error(`子プロセスが終了しました。終了ステータス: ${statusCode}`);
}
});
このスクリプトを実行すると、現在のディレクトリにあるすべてのファイルとディレクトリの詳細な一覧が表示されます。
補足
spawn
モジュールは、シェルコマンドだけでなく、Node.js スクリプトも実行するために使用できます。- 子プロセスの入力を制御するには、
stdin
プロパティを使用します。 - 子プロセスとの通信をより詳細に制御するには、
exec
またはexecFile
関数を使用することもできます。
サンプルコード:Node.jsで子プロセスを生成し、端末出力をリアルタイムで取得する
const { spawn } = require('child_process');
const childProcess = spawn('ls', ['-l']);
childProcess.stdout.on('data', (data) => {
console.log(data.toString());
});
childProcess.stderr.on('data', (data) => {
console.error(data.toString());
});
childProcess.on('exit', (statusCode) => {
if (statusCode !== 0) {
console.error(`子プロセスが終了しました。終了ステータス: ${statusCode}`);
}
});
このコードの説明:
const { spawn } = require('child_process');
:spawn
モジュールをインポートします。const childProcess = spawn('ls', ['-l']);
:spawn
関数を使用して、ls
コマンドを実行し、詳細な一覧表示 (-l
) をオプションとして指定して、子プロセスを生成します。childProcess.stdout.on('data', (data) => { ... });
: 子プロセスの標準出力からデータが受信されたときに呼び出されるイベントリスナーを設定します。このリスナーは、受信されたデータをコンソールに出力します。childProcess.on('exit', (statusCode) => { ... });
: 子プロセスが終了したときに呼び出されるイベントリスナーを設定します。このリスナーは、子プロセスの終了ステータスをチェックし、エラーが発生した場合はエラーメッセージを出力します。
このコードを実行する方法:
- このコードを
.js
ファイル(例:child-process-example.js
)に保存します。 - ターミナルで、次のコマンドを実行してスクリプトを実行します。
node child-process-example.js
出力例:
drwxr-xr-x 2 user group 4096 Jun 17 10:12 .
-rw-r--r-- 1 user group 819 Jun 17 10:12 child-process-example.js
- このコードは、基本的な例です。より複雑な処理を行う場合は、
spawn
モジュールのドキュメントを参照してください。
Node.jsで子プロセスを生成し、端末出力をリアルタイムで取得するその他の方法
exec
モジュールは、シェルコマンドを実行し、その出力を文字列として返します。リアルタイム出力を取得するには、child_process.exec
関数のオプションとしてstdio
オプションを使用する必要があります。
const { exec } = require('child_process');
exec('ls -l', { stdio: ['pipe', 'pipe', 'ignore'] }, (error, stdout, stderr) => {
if (error) {
console.error(error);
return;
}
console.log(stdout);
});
このコードは、ls
コマンドを実行し、その出力をコンソールに出力します。
execFile
モジュールは、実行可能ファイルを実行し、その出力を文字列として返します。exec
モジュールと同様に、stdio
オプションを使用してリアルタイム出力を取得できます。
const { execFile } = require('child_process');
execFile('ls', ['-l'], { stdio: ['pipe', 'pipe', 'ignore'] }, (error, stdout, stderr) => {
if (error) {
console.error(error);
return;
}
console.log(stdout);
});
readline
モジュールを使用して、子プロセスの標準入力と標準出力からデータを逐次読み取ることができます。
const { spawn, createInterface } = require('child_process');
const readline = require('readline');
const childProcess = spawn('ls', ['-l']);
const rl = readline.createInterface({
input: childProcess.stdout,
output: process.stdout,
});
rl.on('line', (line) => {
console.log(line);
});
childProcess.on('exit', (statusCode) => {
if (statusCode !== 0) {
console.error(`子プロセスが終了しました。終了ステータス: ${statusCode}`);
}
rl.close();
});
サードパーティのライブラリ
Node.jsには、子プロセス管理を簡素化するサードパーティのライブラリがいくつかあります。
これらのライブラリは、エラー処理、入出力の管理、複数のプロセスの同時実行など、より高度な機能を提供します。
使用する方法は、ニーズによって異なります。
- シンプルなコマンドを実行して出力を取得するだけの場合、
spawn
モジュールが最も簡単です。 - リアルタイム出力を必要とし、より詳細な制御が必要な場合は、
exec
、execFile
、またはreadline
モジュールの使用を検討してください。 - より高度な機能が必要な場合は、サードパーティのライブラリを使用することを検討してください。
Node.jsには、子プロセスを生成し、端末出力をリアルタイムで取得するためのさまざまな方法があります。ニーズに合った方法を選択してください。
node.js spawn capture-output