次のようにnode.jsプロセスを起動するとします。
node script.js &
プロセスの開始後にプロセスにデータをパイプする方法はありますか?
通常、私たちは次のことを行います。
cat <file> | node script.js
しかし、私が見る問題は、時々Node.jsプロセスが実際に早く開始されないことです。
私の目標は、ファイルにデータがない場合でもnode.jsプロセスが開始されるようにすることです。
そのため、node.jsプロセスをバックグラウンドプロセスとして起動し、パイプに接続しようとしていますが、これが可能かどうかはわかりません。
答え1
を使用して生成された名前付きパイプ(fifos)のバリエーションを探しているようですmkfifo
。
その後、次のようにできます。
mkfifo my-pipe
node script.js < my-pipe &
書き込みのためにmy-pipeを開くまでブロックされます。したがって、script.jsがファイルを開くことができるようにするには(もちろん、まだファイルから何も読み取ることができません)、書き込み用にファイルを開く必要があります。これを行う簡単な方法は、そのファイルにスリープモードをリダイレクトすることです。 (sleep 3650d > my-pipe &
)。これはまた、スリープモードを終了するまでscript.jsがファイルの終わり(EOF)を取得するのを防ぎます(書き込み用に開いているfifoがなく、すべてのデータが消えた場合は読み取り側からEOFを取得します)。
これでmy-pipeに書き込むことで、いつでもより多くの行を提供できます。ナビゲーション(またはmmapなど)なしで書き込むと機能します。でテストできますecho 'DATA' > my-pipe
。
したがって、すべてを総合すると、次のようになります。
mkfifo my-pipe
node script.js < my-pipe &
sleep 3650d > my-pipe &
sleep_pid=$!
get-data-command > my-pipe # placeholder for real command to get data
get-data-command > my-pipe
# and so on, for more data.
kill $sleep_pid # kill the sleep, giving script.js an EOF.
Wildcardが指摘したように、実際にはscript.jsがリスニングソケットを開いてそのようにデータを受け入れたいと思うかもしれません。 TCPソケットのように認証を処理したくない場合は、Unixドメインソケットを使用できます(Unixソケットはファイル権限を使用するため)。