web-dev-qa-db-ja.com

すでに開始されているプロセスにデータをパイプします

次のようにnode.jsプロセスを開始するとします。

node script.js &

開始後にデータをそのプロセスにパイプする方法はありますか?

通常、これを行います。

cat <file> | node script.js 

しかし、私が見ている問題は、node.jsプロセスが実際には事前に起動しない場合があるということです。

私の目標は、ファイルにデータがない場合でも、node.jsプロセスが何があっても確実に起動するようにすることです。

そのため、node.jsプロセスをバックグラウンドプロセスとして開始し、それをパイプに接続することを考えていましたが、それが可能かどうかはわかりません。

2
Alexander Mills

mkfifoで作成された名前付きパイプ(fifos)のバリエーションを探しているようです。

次に、次のようなことを行うことができます。

mkfifo my-pipe
node script.js < 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.

ワイルドカードが指摘しているように、実際にはscript.jsでリスニングソケットを開き、その方法でデータを受け入れることができます。 TCPソケット(Unixソケットは代わりにファイルパーミッションを使用するため)で行う必要があるように認証を処理する必要を回避したい場合は、Unixドメインソケットを使用できます。

4
derobert