情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsで子プロセスを起動し、非同期的に実行する

子プロセスを起動し、非同期的に実行するにはchildProcess.spawn関数を使用します。

第1引数に実行するコマンドを指定します。

第2引数にコマンドの引数リストを配列として指定します。

第3引数にオプションをオブジェクトとして指定します。

主なオプションには下のようなものがあります。

  • cwd・・・カレントワーキングフォルダです。デフォルトはundefinedです。
  • env・・・環境変数のキーバリューペアです。デフォルトはprocess.envです。
  • stdio・・・標準入出力に関する設定です。デフォルトはpipeです。

stdioには子プロセスの標準入力、標準出力、標準エラー出力をどのように処理するかを順番に配列として指定します。

主な指定方法には下のようなものがあります。

  • pipe・・・ChildProcess.stdinChildProcess.stdoutChildProcess.stderrを標準入力、標準出力、標準エラー出力として使用します。
  • ipc・・・IPCチャネルを使用します。
  • ignore・・・何も使用しません。
  • ストリーム・・・このストリームを使用します。

また、stdioには下のような文字列を設定することもできます。

  • pipe・・・['pipe', 'pipe', 'pipe']と同じ。
  • ignore・・・['ignore', 'ignore', 'ignore']と同じ。
  • inherit・・・[process.stdin, process.stdout, process.stderr][0,1,2]と同じ。

返り値として子プロセスを表すchildProcess.ChildProcessクラスのインスタンスが得られます。

子プロセスが終了するとexitイベントが発生します。このイベントのイベントハンドラの第1引数は子プロセスの終了コードです。

子プロセスの標準入出力のストリームが閉じられるとcloseイベントが発生します。このイベントのイベントハンドラの第1引数は子プロセスの終了コードです。子プロセスが終了しても標準入出力のストリームが閉じられない場合があることに注意してください。

子プロセスの処理時にエラーが発生した場合にはerrorイベントが発生します。このイベントのイベントハンドラの第1引数はエラーオブジェクトです。

サンプルコード1

新しいNode.jsを子プロセスとして起動し、child-process.jsを非同期的に実行します。

オプションのstdioinheritを指定することにより、子プロセスは自身の標準入出力として親プロセスの標準入出力を使用します。

child-process-spawn.js

var childProcess = require('child_process');

var p = childProcess.spawn('node', ['child-process.js'], { stdio: 'inherit' });
p.on('exit', function (code) {
    console.log('child process exited.');
});
p.on('error', function (err) {
    console.error(err);
    process.exit(1);
});

child-process.js

console.log('from console.log in child process.');
console.error('from console.error in child process.');

実行結果

C:\work\node>node child-process-spawn.js
from console.log in child process.
from console.error in child process.
child process exited.

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js