2020年5月3日日曜日

Node.js for macOSの謎の挙動

Node.jsでちょっとしたツールを作っていたんですが、child_process.spawn()で謎の挙動があったのでメモ。

ツールについては近々発表しますが、別に大したものではありません。

準備

あらかじめecho abcde >somefileのようにしてsomefileを作っておきます。

ソースコード

こんなソースコードを作って実行してみます。
const childProcess = require("child_process");
const fs = require("fs");
const readStream = fs.createReadStream("somefile");

readStream.on("open", () => {
 // stdoutが出力されない(stderrは出力される)
 childProcess.spawn("cat", [], {
  stdio: [readStream, "inherit", "inherit"],
 });
});
子プロセスとしてcatコマンドを起動し、標準入力をsomefileに、標準出力と標準エラー出力を親プロセス(実行しているJavaScriptファイル)のそれに割り当てています。 つまりcat <somefileと同じことをしているのですが、結果が標準出力に出ません

標準エラー出力の処理方法を変えると標準出力が出なくなるというよくわからない挙動ですが、Node.jsのissueにそれっぽいものが見当たりません。

この現象を確認したのはmacOS CatalinaのNode.js v10.19.0 / v12.16.1で、同じv12.16.1でもGentoo Linuxでは再現しませんでした。macOS版のバグ?

ちなみに、以下のように標準エラー出力をプログラムから制御できるように"pipe"にしてやると、問題なく標準出力に出ます。
const childProcess = require("child_process");
const fs = require("fs");
const readStream = fs.createReadStream("somefile");

readStream.on("open", () => {
 // stderrに"pipe"を指定すると出力される
 const p = childProcess.spawn("cat", [], {
  stdio: [readStream, "inherit", "pipe"],
 });
 p.stderr.on("data", (data) => {
  process.stderr.write(data);
 });
});
何だろう。issueに投げてみるかな。

0 件のコメント:

コメントを投稿