Node.js
子プロセスによるファイルまたはコマンドの実行
サーチ…
構文
- child_process.exec(command [、options] [、callback])
- child_process.execFile(file [、args] [、options] [、callback])
- child_process.fork(modulePath [、args] [、options])
- child_process.spawn(command [、args] [、options])
- child_process.execFileSync(file [、args] [、options])
- child_process.execSync(コマンド[、options])
- child_process.spawnSync(command [、args] [、options])
備考
子プロセスを扱う場合、すべての非同期メソッドはChildProcess
インスタンスを返しますが、すべての同期バージョンは実行されたものの出力を返します。 Node.js内の他の同期操作と同様に、エラーが発生すると、それはスローされます。
新しいプロセスを生成してコマンドを実行する
バッファ child_process.spawn()
されていない出力を必要とする新しいプロセスを生成するには(例えば、印刷するのではなく一定時間に渡って出力を出力し、すぐに終了するような長時間実行するプロセス)、 child_process.spawn()
使用します。
このメソッドは、指定されたコマンドと引数の配列を使用して新しいプロセスを生成します。戻り値は、 ChildProcess
インスタンスで、 stdout
およびstderr
プロパティを提供します。これらのストリームの両方がstream.Readable
インスタンスです。
次のコードは、コマンドls -lh /usr
実行と同じです。
const spawn = require('child_process').spawn;
const ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
ls.stderr.on('data', (data) => {
console.log(`stderr: ${data}`);
});
ls.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});
別のコマンド例:
zip -0vr "archive" ./image.png
次のように書くことができます:
spawn('zip', ['-0vr', '"archive"', './image.png']);
シェルを起動してコマンドを実行する
バッファされた出力が必要な(つまり、ストリームではない)シェルでコマンドを実行するには、 child_process.exec
使用しchild_process.exec
。たとえば、 cat *.js file | wc -l
を実行する場合は、オプションなしのcat *.js file | wc -l
は次のようになります。
const exec = require('child_process').exec;
exec('cat *.js file | wc -l', (err, stdout, stderr) => {
if (err) {
console.error(`exec error: ${err}`);
return;
}
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
});
この関数は最大3つのパラメータを受け取ります。
child_process.exec(command[, options][, callback]);
コマンドパラメータは文字列であり、必須ですが、オプションオブジェクトとコールバックは両方ともオプションです。オプションオブジェクトが指定されていない場合、 exec
はデフォルトとして以下を使用します。
{
encoding: 'utf8',
timeout: 0,
maxBuffer: 200*1024,
killSignal: 'SIGTERM',
cwd: null,
env: null
}
オプションオブジェクトはshell
パラメータもサポートしています。これは、デフォルトではUNIXでは/bin/sh
、Windowsではcmd.exe
、プロセスのユーザIDを設定するためのuid
オプション、グループIDのgid
オプションです。
コマンドが実行されたときに呼び出されるコールバックは、3つの引数(err, stdout, stderr)
呼び出されます。コマンドが正常に実行された場合、 err
はnull
になりnull
。そうでない場合はError
インスタンスになりますerr.code
はプロセスの終了コードで、 err.signal
は終了するために送信されたシグナルです。
stdout
およびstderr
引数は、コマンドの出力です。オプションオブジェクト(デフォルト: string
)で指定されたエンコーディングでデコードされますが、それ以外の場合はBuffer
オブジェクトとして返されます。
また、 execSync
という同期バージョンのexec
も存在します。同期バージョンはコールバックをとらず、 ChildProcess
インスタンスの代わりにstdout
を返します。同期バージョンでエラーが発生すると 、プログラムがスローされて停止します。これは次のようになります。
const execSync = require('child_process').execSync;
const stdout = execSync('cat *.js file | wc -l');
console.log(`stdout: ${stdout}`);
実行可能ファイルを実行するプロセスの生成
実行可能ファイルなどのファイルを実行する場合は、 child_process.execFile
使用しchild_process.execFile
。 child_process.exec
ようなシェルを生成するのではなく、直接新しいプロセスを作成します。これはコマンドを実行するよりもやや効率的です。関数は以下のように使うことができます:
const execFile = require('child_process').execFile;
const child = execFile('node', ['--version'], (err, stdout, stderr) => {
if (err) {
throw err;
}
console.log(stdout);
});
child_process.exec
とは異なり、この関数は最大4つのパラメータを受け入れます.2番目のパラメータは、実行可能ファイルに指定する引数の配列です。
child_process.execFile(file[, args][, options][, callback]);
そうでなければ、オプションとコールバック形式はchild_process.exec
と同じです。関数の同期バージョンの場合も同じです:
const execFileSync = require('child_process').execFileSync;
const stdout = execFileSync('node', ['--version']);
console.log(stdout);