Node.js の child_process.spawn() ではまった
Node.jsのchild_process.spawn()でエディタを起動した場合に動作が不安定になるという問題があったので解決方法を記録。
最初は以下のようなコードでエディタを起動していました。(実際にはネストしたコールバックの中で呼び出される)
var editFile = function(file, cb) { var editor = process.env.EDITOR || 'vim'; var child = spawn(editor, [file], { cwd : process.cwd(), customFds : [process.stdin, process.stdout, process.stderr] }); child.on('exit', function() { cb(); }); };
これを以下のように、stdin(WritableStream)に対してpause()、resume()を使うように修正して解決しました。エディタの起動中は親プロセス側の標準入力を一時的に停止してTTYからの入力が子プロセスのみにされるようにしているわけです。
なお、customFDsが変わっているのは Node v0.6.x 対応です。こちらにあるようにAPIの仕様が変わり、customFDs には任意のストリームを指定することができなくなったため(正確にはdeprecatedなのでそのうち使えなくなるかも)、標準入出力のfdを指定しています。
var editFile = function(file, cb) { var editor = process.env.EDITOR || 'vim'; var child = spawn(editor, [file], { cwd : process.cwd(), customFds : [0, 1, 2] }); process.stdin.pause(); child.on('exit', function() { process.stdin.resume(); cb(); }); };
他にもっといい方法があるかなぁ?