child_process

更新


子プロセス発生

require必要

const { spawn, spawnSync, exec, execSync,
  execFile, execFileSync, fork } = require('child_process')
// 以降前提

使い分け

  1. 同期したいなら、〜Sync()
  2. 入力がある、出力が多いなら、spawn()
  3. 複合コマンドなら、exec()
  4. スクリプトなら、execFile()
  5. 別のNode.jsプロセスなら、fork()

spawn('コマンド名', [引数])

node.js

// process.ppidはNode.jsプロセスの親のPID(BashのPID)
const コマンド = spawn('pstree', ['-p', process.ppid])

コマンド.stdout.on('data', data => { // ストリーム
  console.log(`${data}`) // data.toString()
})
コマンド.on('close', code => {
  console.log('終了ステータス:', code)
})

node node.js

bash(27869)---node(28072)-+-pstree(28079)
                          |-{node}(28073)
(中略)

終了ステータス: 0

親子関係

使いみち


子プロセスどうしでパイプ

readable.pipe(writable)

const echo = spawn('echo', ['-n', 'abc'])
const cat = spawn('cat')

echo.stdout.pipe(cat.stdin)
cat.stdout.on('data', data => {
  console.log(`${data}`)
})

spawn()で入出力

script.sh

#!/bin/bash
select e in a b c
do
  [[ $e ]] && break
done
echo $e

{stdio: 'inherit'}

spawn('./script.sh', {stdio: 'inherit'})

spawn()で複合コマンド

const 複合コマンド = `select e in a b c
do
  [[ $e ]] && break
done
echo $e
`

spawn('bash', ['-c', 複合コマンド], {stdio: 'inherit'})

exec('複合コマンド')

exec(`pstree -p ${process.ppid} | cat`, (error, stdout, stderr) => {
  console.log(stdout)
})
bash(9915)---node(12026)-+-sh(12033)-+-cat(12035)
                         |           `-pstree(12034)
(中略)

親子関係

注意: 最大バッファmaxBuffer内で


execFile('スクリプトパス', [引数])

execFile('./script.sh', [process.ppid], (error, stdout, stderr) => {
  console.log(stdout)
})

script.sh

#!/bin/bash
pstree -p $1
bash(10108)---node(12351)-+-script.sh(12358)---pstree(12359)
(中略)

fork('子.js'): 新たなNode.jsプロセスを動かす

parent.js

// 子プロセスを戻す
const 子 = fork(`${__dirname}/child.js`)
子.on('message', message => {
  console.log('子から:', message)
})
子.send({親pid: process.pid})

child.js

process.on('message', message => {
  console.log('親から:', message)
})
process.send({子pid: process.pid})

node parent.js

子から: { '子pid': 12661 }
親から: { '親pid': 12654 }