最新のファイルの最後の数行を表示できるように、ディレクトリ内のファイルを連続的にリンクするにはどうすればよいですか?

最新のファイルの最後の数行を表示できるように、ディレクトリ内のファイルを連続的にリンクするにはどうすればよいですか?

Twitterを聞き、特定のキーワードを含むツイートをJSONファイルに保存するスクリプトがあります。スクリプトが起動されるたびに、新しいターゲットファイルが生成されます。

時々私のスクリプトがクラッシュし、自動的に再起動され、プロセスは新しいJSONファイルを生成します。

着信ツイートの実行ログを表示したいです。単一のファイルを使用して、次のことができます(jqJSONで単一のフィールドのみを表示するようにパイプ)。

tail -f file1.json | jq '.text'

ただし、スクリプトがクラッシュして再起動すると、新しいファイルが作成され(たとえばfile2.json)、上記のコマンドは更新されなくなったファイルを受け取ります。

この問題を解決するには、ディレクトリ内のすべてのファイルとtail -f | jq '.text'結果を関連付ける必要があると思いました。

しかし、私はできるcat *現在のフォルダにあるすべてのファイルをリンクするには、新しいファイルが自動的に接続に追加されないようです。

常に最新のファイルの最新行を表示できるように、フォルダ内のすべてのファイルを連続してリンクするにはどうすればよいですか?

ベストアンサー1

このソリューションは、移植性のないtail -F(例:)ものを使用します。tail --follow=name --retryテストにはGNUを使用してくださいtail

次のように進んでください。

  1. monitored一般的なファイルとして作成する:

    : >>monitored
    
  2. file*.json定期的にファイルがあることを確認してくださいmonitored。その場合は、monitoredファイルへのハードリンクに置き換えてください。

    while sleep 1; do
        find . \( -name . -o -prune \) -name 'file*.json' -newer monitored -exec ln -f {} monitored \;
    done
    

    上記のループはバックグラウンドで実行できます。

  3. monitored名前で監視:

    tail -F monitored
    

    jq '.text'パイプや他の手段で行うことができます。

メモ:

  • あなたの明確な質問は次のとおりです

    常に最新のファイルの最新行を表示できるように、フォルダ内のすべてのファイルを連続してリンクするにはどうすればよいですか?

    私の解決策は「継続的に接続」されていません。しかし、「最新のファイルの最新行を見ることができます」。

  • 同じ秒で多くのファイルが作成/更新されると、各ファイルが一瞬だけ表示されるというfile*.json保証はなく、一部のファイルはスキップできます。monitoredただし、スクリプトが時々クラッシュして自動的に再起動されるため、一度再起動してから次回再起動するまでに1秒以上かかることがあります。それでは問題ありません。

    通常、問題が発生する可能性があります。 「最新のファイル」状態があるファイルから別のファイルに頻繁に移動する場合、このソリューションは完全に信頼できないことが明らかになりました。

おすすめ記事