Node.jsでshellコマンドを叩く

先日「dotjs面白いところ - ぽりぴぃすらいと」なんてのを書いてpullしたんですが

rubyWEBrickOS Xにはデフォなんだからそっちで
thx

みたいな返事が返ってきて萎えな僕です。

dotjsなんだからserverもinstallerもjsでかけよ!ってのは宗教的な問題でした。

さておき

まあ、installerを書いたあたりでshellコマンドを叩いたりしてみたのでちょっとまとめます
shellコマンドを叩くには2種類のAPIが用意されています。1つはexec、もう一つがspawnです。

exec

1回こっきりのコマンドを叩く場合はこちらがいいでしょう。コマンドを文字列で渡してcallbackで受け取るだけです。

$ sh -c '文字列'

みたいな気分で実行できます。

  • 1. まず、shellコマンドを実行するためにはchild_processモジュールをrequireします。
var exec = require('child_process').exec;
  • 2. execは以下のようにして、使います。引数は、「コマンド文字列」「options(省略可)」「callback」です。
exec('ls -l ./', function(err, stdout, stderr){
  /* some process */
});
  • 3. これだけでいろいろと出来ます。

当然この結果も非同期なので、ここで思いgrep|uniq|sortとかパイプで流したりして、コールバックで受けて、みたいにすると夢が広がったりします。

spawn

なんども叩くやつに向いてます。sarとか、psとか、topとか、lsとか

  • 1. spawnを呼び出す。
var spawn = require('child_process').spawn;
  • 2. 次にコマンドを登録します
var sar = spawn('sar', ['-r']);
sar.stdout.setEncoding('utf8'); // .stdout・.stderrは通常のstreamと同じなのでsetEncodingでbufferじゃなくできます。
sar.stdout.on('data', function(data){
  // some process
});
sar.on('exit', function(){
  process.exit(0);
});

こんな風にすることで、例えば、ずっと受け続けて、正規表現にマッチするのだけ、とか、特定の文字列が出てきたら、とか、ある値以上だったら、とかの処理を書くことができます。fdを監視しているのと同じノリで監視系とか書くのはnode向いてるかもしれません。

wktk!