seek()
プログラムが名前付きパイプで操作を実行しようとしたときに「不正なナビゲーション」の代わりに正常に返す方法はありますか(パイプが空のファイルであるかのように)。
私のシステム上のすべてのログはSQLiteデータベースに保存され、どこにもファイルはありません。ただし、この問題を解決するいくつかのプログラムがあります。具体的には2つの状況があります。
- プログラムは、syslog-ngが名前付きパイプで作成し、読み取っているログファイルに書き込もうとします。プログラムが何らかの理由で実行しようとしましたが、
seek()
失敗しました。 - プログラム(denyhostsやfail2banなど)は、syslog-ngが名前付きパイプで作成され、記録されているログファイルを読み取ろうとします。プログラムが
seek()
そのタスクを実行しようとしましたが失敗しました。
理想的には、名前付きパイプが空のファイルであるかのように検索が機能するようにしたいと思います。ログを書き込むプログラムがナビゲーションを実行する理由はわかりません。追加のためにファイルを開いて書き込みを開始します。私はプログラムの読み取りが最後の場所で再開されるようにナビゲートしたい理由を理解できるので、ファイルが空のように(切り捨てられたように)動作したいと思います。
それでは、名前付きパイプがこのように動作するようにいくつかのオプションを設定できますか?そうでない場合は、パイプが開いたときにsyslog-ngがこのように動作するようにモードを設定できますか(コードを変更しますか?)それとも私が小川にいるのでしょうか?
答え1
Linuxカーネル用の検索可能なパイプが提案されていますが、それを実装するために使用できるパッチはありません。
使用できるLD_PRELOAD
'ed ライブラリはlseek
特定のファイルへの呼び出しを無視します。私はこの目的に使用できる既製の包装紙を知りません。シャドウファイルシステム1つを書くのが役に立つかもしれません。
答え2
アプリケーションが検索を呼び出す場合は、アプリケーションが破損しているかパイプで機能しない可能性があります。電子なら修正が必要です。後者の場合、検索が実際に機能することを期待しているため、うまくいかないときにうそをついて動作すると主張すると、間違った作業が発生することがほぼ確実です。
また、ログファイルが名前付きパイプに変わると、一度に1つのプロセスしか読み取ることができません。ソケットでなければなりません。