シェルコマンドを実行する方法(child_process)

Node.jsでシェルコマンドを実行させる方法はいくつか存在します。ここでは、「exec」「execSync」「spawn」について動作の違いを確認します。

exec
(非ストリーム形式, 非同期実行)

exec の動作確認をします。exec.js というファイルに以下処理を記述します。

const { exec } = require('child_process')

exec('ls -l sample.txt', (err, stdout, stderr) => {
    if (err) {
      console.log(`stderr: ${stderr}`)
      return
    }
    console.log(`stdout: ${stdout}`)
  }
)
console.log('わくわくBank')

コールバックでコマンドの出力結果を取得できます。

$ node exec.js 
わくわくBank
stdout: -rwxr-xr-x  1 xxx  xxx  21166 Nov 22 01:02 sample.txt

非同期なので わくわくBank の出力が先に行われています。

ls の部分を存在しないコマンド( aaa )にしてエラーを発生させてみます。

$ node exec.js 
わくわくBank
stderr: /bin/sh: aaa: command not found

execSync
(非ストリーム形式, 同期実行)

同期実行させたい場合、execSync を利用します。

execSync の動作確認をします。execSync.js というファイルに以下処理を記述します。

const { execSync } = require('child_process')

const stdout = execSync('ls -l sample.txt')
console.log(`stdout: ${stdout.toString()}`)
console.log('わくわくBank')
$ node execSync.js 
stdout: -rwxr-xr-x  1 xxx  xxx  21166 Nov 22 01:02 sample.txt

わくわくBank

spawn
(ストリーム形式, 非同期実行)

大きいデータを扱う場合、ストリーム形式である spawn のほうが適しています。
(一度に全てのデータをメモリに読み込むとメモリ不足になるため)

spawn の動作確認をします。spawn.js というファイルに以下処理を記述します。

const { spawn } = require('child_process')

const childProcess = spawn('cat', ['sample.txt'])

console.log('process id:' + process.pid)
console.log('child process id:' + childProcess.pid)

childProcess.stdout.on('data', (chunk) => {
  console.log(new Date())
  console.log(chunk.length)
  // console.log(chunk.toString())
})
$ node spawn.js 
process id:44066
child process id:44093
2019-11-21T16:32:48.073Z
8192
2019-11-21T16:32:48.076Z
8192
2019-11-21T16:32:48.076Z
4782

spawn の場合、上記のように少しずつデータを取得しています。

比較として execSync の動作確認を行います。

const { execSync } = require('child_process')

const stdout = execSync('cat sample.txt')
console.log(`stdout: ${stdout.length}`)

execSync の場合、以下のように一括でデータを取得しています。

$ node execSync.js 
stdout: 21166

参考

【エンジニア向け】仕事を見つける方法

転職する

転職エージェントを活用する

転職サイトの場合、自身でサイト上から企業を探す必要があります。 一方「レバテックキャリア」 などの転職エージェントの場合、エージェントが企業を紹介してくれます。エージェントが間に入ることにより、日程調整や、条件交渉などもサポートしてくれます。

転職ドラフトを活用する

転職ドラフト」は、 企業がITエンジニアをドラフトという形で指名するサービスです。年収が最初に提示されるなどのメリットがあります。 ただ、初回登録時にレジュメ作成が必要で、すでにエンジニア経験が豊富にあるエンジニア向けのサービスかと思います。 レジュメ作成が手間ですが、自身のキャリアを見直す機会になり、他の仕事探しにも役立つはずです。

エンジニア転職保証のあるスクールを活用する

ある程度、開発経験のあるかたであれば、独学で必要なスキルを身につけることができるはずです。ただ、別業種からエンジニアに転職したい場合など、1から独学で学ぶのはハードルが高いです。そういった方は、スクールの活用を検討しても良いと思います。 「TechAcademy」は、エンジニア転職保証コースを提供しています。給付金制度の対象講座として認定されているため、金銭面の負担も抑えることができます。

フリーランスとして活動する

レバテックフリーランス」「ITプロパートナーズ」「ギークスジョブ」は、フリーランスエージェントサービスです。 エージェントによって、支払いサイトなど細かい違いはありますが、まずは良い案件を見つけることが重要です。 登録自体は無料なので、複数エージェントに登録して、より多くの案件を紹介してもらうのがおすすめです。

logo
わくわくBank.
技術系の記事を中心に、役に立つと思ったこと、整理したい情報などを掲載しています。