永続性名前付きパイプのようなものを探しています...catまたはgrepを複数回使用でき、常にパイプに供給するすべてのプロセスの現在の状態を取得できます。
/tmp/timestamp
たとえば、名前付きパイプを作成し、次のように書くとしdate
ます。
mkfifo /tmp/timestamp
date --iso-8601=seconds > /tmp/timestamp
この時点で、ペアへの呼び出しはdate
ブロックされ、/tmp/timestamp
読み取りを待ちます。
cat `/tmp/timestamp`
ブロックがブロック解除され、stdoutに書き込むなどのdate
内容が表示され、終了します。2017-03-18T16:11:54-04:00
date
...しかし、毎回日付を更新したい場合はどうすればよいですかcat /tmp/timestamp
?
そうかもしれないと思います。
while :; date --iso-8601=seconds > /tmp/timestamp; done
うまくいきますが、a)このアプローチには明らかではない問題があるのか、b)ループが不要な方法があるのか疑問に思います。
また、FIFOを常に使用できるように自動的に起動するように設定したいと思います。
これをパイプラインに入れたいのは、関連情報がWebアプリケーションをサポートするデータベースに格納されるためです。ほとんどのテクニカルサポートスタッフは、SSHを介してサーバーにログインし、データベースでクエリを実行することを嬉しく思いますが、いくつかの重要な統計があります。本物ファイルから単にgrepするのが便利です。名前付きパイプを含むディレクトリにアクセスできる場合は、ls
これらのエントリをすべて検索できます。本質的にしなければならないので、これを行うのではなく、良いたとえ話だと思うので行うことです。
答え1
カスタムファイルシステムをカーネルモジュールとして実装したり、サーキットブレーカを使用したりできます。対応するカスタムファイルシステム内で必要な仮想ファイルを持つことができます。
答え2
これはループの「明らかな問題」です。読み取りプロセスがfifoを開いたままにしている場合(たとえば、他のファイルを開く間にブロックまたは停止するため)、書き込みループは継続的に実行されます(fifoバッファがいっぱいになるまで)。複数の同時リーダーには問題がありますが、おそらくその可能性を合理的に排除できます。
非ループソリューションでは、fifoの代わりにソケットを使用できますが(単純な)リーダープログラム(またはそのプログラム以外のものを実行するにはパイプ)を作成する必要がありcat
ますopen
。