古い名前で新しいファイルを追尾する

古い名前で新しいファイルを追尾する

これは次のようなものだまだ作成されていないファイルの追跡を開始する方法ただし、その名前のファイルは既に存在します。

複数回実行されるプログラムがあります。出力ファイル名がすでに使用されている場合、_XYZファイル拡張子の前にXYZ最小の整数(例えば、 output.outoutput_001.out(または、すでに存在するoutput_002.out場合など)になりoutput_001.out、プライマリ名で新しい出力ファイルが作成されます。

プライマリ名を tail すると、 であっても-F、既存のファイルの tail が直ちに開始され、ファイル名が変更されてもその inode へのハンドルが保持され、新しいファイルは無視されます。

プログラムはキュー管理を備えた共有クラスター上で実行されるため、実行は長く変動する遅延で開始されます。

新しいファイルが作成されるのを待たずに、そのファイルを tail することは可能ですか? もし可能であれば、どのようにすればよいですか?

答え1

tail -Fすでにこれを行う必要があります。

空の を作成します/tmp/t/file。次に、ターミナル 1 で を起動しtail -F、実行したままにします。

anthony@Zia:~$ tail -F /tmp/t/file
a
b
tail: `/tmp/t/file' has become inaccessible: No such file or directory
tail: `/tmp/t/file' has appeared;  following end of new file
c
d

ターミナル2では次のことを行いました。

anthony@Zia:/tmp/t$ echo a >> file
anthony@Zia:/tmp/t$ echo b >> file
anthony@Zia:/tmp/t$ mv -i file file.old; echo c >> file
anthony@Zia:/tmp/t$ echo d >> file

ご覧のとおり、tail -Fは確かに名前の後に続きますが、inode の後に続きません。tailに異なる意味を与える を使用している可能性があります (このフラグは BSD 拡張であり、後に GNU にもコピーされました)。または、お使いのバージョンにバグがある可能性があります。 (GNU tail 代替構文) または(ディレクトリ全体の末尾を表示します)-Fを試すこともできます。tail --follow=name --retryxtail

関連情報