Node.jsでspawnモジュールを使って子プロセスを生成し、端末出力をリアルタイムで取得する方法

2024-06-17

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}`);
  }
});

このコードの説明:

  1. const { spawn } = require('child_process');: spawnモジュールをインポートします。
  2. const childProcess = spawn('ls', ['-l']);: spawn関数を使用して、lsコマンドを実行し、詳細な一覧表示 (-l) をオプションとして指定して、子プロセスを生成します。
  3. childProcess.stdout.on('data', (data) => { ... });: 子プロセスの標準出力からデータが受信されたときに呼び出されるイベントリスナーを設定します。このリスナーは、受信されたデータをコンソールに出力します。
  4. childProcess.on('exit', (statusCode) => { ... });: 子プロセスが終了したときに呼び出されるイベントリスナーを設定します。このリスナーは、子プロセスの終了ステータスをチェックし、エラーが発生した場合はエラーメッセージを出力します。

このコードを実行する方法:

  1. このコードを .js ファイル(例:child-process-example.js)に保存します。
  2. ターミナルで、次のコマンドを実行してスクリプトを実行します。
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モジュールが最も簡単です。
    • リアルタイム出力を必要とし、より詳細な制御が必要な場合は、execexecFile、またはreadlineモジュールの使用を検討してください。
    • より高度な機能が必要な場合は、サードパーティのライブラリを使用することを検討してください。

    Node.jsには、子プロセスを生成し、端末出力をリアルタイムで取得するためのさまざまな方法があります。ニーズに合った方法を選択してください。


    node.js spawn capture-output


    【徹底解説】Node.jsでJSONをログ出力!console.logだけじゃない、3つの方法とサンプルコード

    console. logを使う最も簡単な方法は、console. logを使ってJSONオブジェクトを直接出力することです。このコードを実行すると、以下の出力がコンソールに表示されます。しかし、console. logで直接出力すると、JSONオブジェクトの構造が分かりにくくなってしまいます。そこで、以下のオプションを使用すると、見やすく整形して出力することができます。...


    Node.js と npm におけるローカル依存関係とは?

    Node. js プロジェクトでローカル依存関係を使用すると、開発中のパッケージやまだ公開されていないパッケージをプロジェクトに簡単に統合できます。これは、依存関係を管理し、プロジェクトの開発を効率化するのに役立ちます。ローカル依存関係とは、プロジェクトの node_modules フォルダー内に存在するパッケージへの参照です。これは、公開されているパッケージとは異なり、npm リポジトリからインストールする必要はありません。...


    Node.js で使用していないパッケージをアンインストール/削除する方法

    npm コマンド以下のコマンドは、NPM を使用してインストールされたパッケージをアンインストールします。npm uninstall <package_name>: 指定されたパッケージをアンインストールします。yarn コマンドYarn を使用している場合は、以下のコマンドを使用できます。...


    Node.js アプリケーションで発生する "FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory" エラーの解決方法

    このエラーは、Node. js アプリケーションが処理に必要なメモリを確保できない場合に発生します。ヒープメモリとは、JavaScript で実行されるプログラムがオブジェクトを格納するために使用する領域です。原因:大量のデータを処理している場合...


    【Node.js × React.js × npm】『Cannot find module '@babel/core』エラーを徹底解説!原因と解決方法を網羅

    "Cannot find module '@babel/core'" エラーは、Node. js、React. js、npm を使用した開発において、Babel コアモジュールが見つからないことを示す一般的なエラーです。Babel は、JavaScript コードを古いブラウザで動作するように変換するトランスパイラと呼ばれるツールです。このエラーは、Babel がインストールされていないか、正しく構成されていない場合に発生します。...