node.jsのchild_processのexecとexecFileとspawnの違い

  • 投稿日:
  • by

nodeのchild_processにはちょっと紛らわしい3つのメソッドがあります。 execとexecFileとspawnです。

いきなり話題がそれますが、forkも紛らわしいですよね。システムコールのforkを連想させるのに、中身は違うので。forkはどちらかと言うと、spawnのラッパーみたいな感じです。

本題に戻ります。google検索すると、execとspawnの違いはいっぱい引っかかります。例えば、これ。

http://www.hacksparrow.com/difference-between-spawn-and-exec-of-node-js-child_process.html

ところが、execFileとの比較は極端に少ないです。どうやら、昔はexecFileはundocumentedだったようですね。

https://github.com/joyent/node/issues/1700

一言で言うと、spawnが自由度が高いメソッドで、execはそのラッパーです。execFileはその中間とでも言いましょうか。execとexecFileの最大の違いは、execは/bin/shを経由してプロセスを起動することです。

nodeのソースを見ると分かりますが、execはexecFileのシンプルなラッパーになっています。また余談ですが、v0.10.18のソースと比較すると少しリファクタリングされて分かりやすくなっています。

個人的には、通常のコーディングではexecFileを使う方がベターだと思います。/bin/shを介さないからです。多くの場合、コマンドラインのスペース区切りを配列に変換するだけのために/bin/shを使っているのではないでしょうか。「通常」というのは誤解を招くかもしれませんが、webのserver sideプログラミングをするという程度の想定です。逆に、execが便利なケースとしては、linux上でちょっとしたスクリプトを書きたい場合ですかね。bashとかperlの代わりに、という感じ。/bin/shのパワーを使いたい場合ですね。例えば、

child_process.exec("cat foo | sort | uniq > bar");

とか。

まとめると、spawnは柔軟なメソッド、execFileはBufferを戻り値にして簡単に扱えるようにしたメソッド、execはスクリプト用の簡易メソッド、という感じですね。というわけで、おすすめはspawnかexecFile、ということで。