名前付きパイプを非同期ジョブキュー(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