既に開始されたプロセスへのデータ転送

既に開始されたプロセスへのデータ転送

次のように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ソケットはファイル権限を使用するため)。

関連情報