Node.jsでshellコマンドを叩く
先日「dotjs面白いところ - ぽりぴぃすらいと」なんてのを書いてpullしたんですが
みたいな返事が返ってきて萎えな僕です。
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」です。
- callbackに渡されるのは、err、標準出力文字列、標準エラー出力文字列です。
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!