テーリングプロセスを停止するためにファイルにEOFを作成しようとしています。

テーリングプロセスを停止するためにファイルにEOFを作成しようとしています。

ファイルを追跡するいくつかのプロセスがあります。ファイルにEOFを作成してトレースプロセスを停止するにはどうすればよいですか?

例えば、

tail -F $HOME/somefile.log

どこかの端末で実行されていますが、どこにいるのかはわかりません。ファイルを追跡するすべてのプロセスがファイルの追跡を停止するようにログファイルにEOFを作成するにはどうすればよいですか?

場合によっては、fifoを追跡します。

mkfifo fivel
tail -f fivel

名前付きパイプにEOFを書き込むと、実際にfifoの後に続くすべてのプロセスが停止/終了する可能性がありますが、通常のファイルにEOFを書き込むと後続のプロセスが停止しない可能性があると思います。

答え1

tail コマンドは、通常のファイルで -f と一緒に実行しても EOF で終了しません。明示的により多くのデータを待ちます。したがって、ファイルの末尾にすでにEOFがあります。終了してはいけませんので、tailは終了しません。

唯一の方法は、尾を殺すことです。走る

ps ax|grep tail

その後、インストールテールプロセスに表示されているプロセスIDを終了します。または使用

pkill tail

すべてのテールプロセスを終了します。終了したくないプロセスを終了する可能性があるため、このオプションを使用するときは注意してください。

答え2

私にとっては、確かにこれを達成する正しい方法のようです。ファイル自体ではなく、ファイルを読み込むテールプロセスをターゲットにしたいと思います。次のようなことを考えてみましょう。

ps -ef | grep "[t]ail" | grep 'somefile.log' | tr -s ' ' | cut -d' ' -f2 | xargs kill
  1. ps -efシステムで実行されているすべてのプロセスが表示されます。
  2. grep "[t]ail"名前にtailを含むすべてのプロセスが検索されます(このgrepを除く)。
  3. grep 'somefile.log'名前にsomefile.logを含むファイルがこのファイルに含まれています。
  4. tr -s ' '複数のスペースをすべて1つに圧縮します。
  5. cut -d' ' -f22番目の列、つまりスペースを区切り文字として使用するPIDのみを取得します。
  6. xargs killそのPIDを終了します。

これにより、ファイルを読み取るすべてのテールプロセスが終了します(tailsomefile.logというログファイルなど、いくつかの奇妙な場合を除く)。おそらくこれを行うためのよりきれいな方法があります。しかし、これが私にとって最初にすぐに確実な解決策でした。 Linuxで動作するようにテストしました。

関連情報