ビルダープロセスが終了した後に名前付きパイプから読み取る方法は?

ビルダープロセスが終了した後に名前付きパイプから読み取る方法は?

名前付きパイプを非同期ジョブキュー(JMSに似ている可能性があります)として使用したいと思います。

たとえば、クライアントがデータベースに挿入したいデータを送信しますが、クライアントがすぐにサーバーおよびサーバープロセスとの接続を切断し、データを名前付きパイプにパイプしたいとします。その後、パイプからデータを読み取り、完全に独立してSQL挿入を実行します。これは非常に遅いかもしれませんが、クライアントはすぐに応答を受け取るので、これに気付かないでしょう。

プロトタイプではこれがうまくいくと思います(単純化のためにnetcatクライアントとサーバーのペアを介して送信されるのではなく、「45」がエコーされます)。

zsh> nohup echo "45" > my_named_pipe &
zsh> exit
zsh: warning: 1 jobs SIGHUPed

その後、はるかに後で実行します。

zsh> cat my_named_pipe

しかし、パイプからは何も出ていません。設定に問題がありますか?

PS:私はnohup仕事をしたことがありません。この場合、私は常にdisown別のコマンドで実行したくない操作に依存します。

ベストアンサー1

これを行うとき:

nohup echo "45" > my_named_pipe &

殻は自然に分裂します。子供にはmy_named_pipe書くことができます。これは、他の項目が読み取り用にopen()開くまでブロックされます。my_named_pipe

exit親プロセスで実行すると、子プロセスはまだブロックされ、まだopen()実行されていませんnohup

したがって、シェルを終了すると、シェルはサブプロセスにSIGHUP信号を送信します。これはまだ実行されていないため無視されませんnohup

速く走る:

(echo 45 > my_named_pipe &)

または以下を使用してzsh

echo 45 > my_named_pipe &!

&!zshはフレーズシュガーですdisown

BASHとZSHには両方ともdisownという素晴らしい組み込み機能があります。これにより、ユーザーはnohupと同様の方法でシェルからプロセスを分離できます。 ZSHには良い砂糖があります。 &!コマンドが終了すると分離されます。 BASHにはそのような砂糖はありません

http://blog.debiania.in.ua/posts/2013-03-13-fun-with-bash-disown.html

おすすめ記事