シンボリックリンク絡みでtail -Fが追従しないケース
tail -Fしているfluent-agent-liteでハマったのでメモ。
存在しないファイルをtail -Fした後、その名前のシンボリックリンクを作った場合
$ rm -fr ~/oreno-tmp && cd ~/oreno-tmp $ tail -F tailme & tail: cannot open `tailme' for reading: No such file or directory $ ln -s real-file tailme tail: cannot watch `tailme': No such file or directory $ date > real-file $ date >> real-file $ date >> real-file # tail -Fから流れてこない
ちなみに、存在するファイルを指すシンボリックをtail -Fしてる場合、途中で指す実ファイルが存在しなくなっても、実ファイルができ次第、追従してくれます。
$ rm -fr ~/oreno-tmp && cd ~/oreno-tmp $ touch real-file.yesterday $ ln -s real-file.yesterday tailme $ tail -F tailme & tail: inotify cannot be used, reverting to polling $ date >> real-file.yesterday Mon Jul 28 21:20:59 JST 2014 $ ln -sf real-file.today tailme tail: `tailme' has become inaccessible: No such file or directory $ date >> real-file.today tail: `tailme' has appeared; following end of new file Mon Jul 28 21:21:39 JST 2014 $ date >> real-file.today Mon Jul 28 21:21:48 JST 2014
つまり、既に存在する日付入りファイル名の実ファイルを指すシンボリックリンクがある場合は、00:00に今日の日付の名前を持つ実ファイルにシンボリックリンクを切り替えたときに、今日の日付の名前の実ファイルはあってもなくてもよい。
が、ド新規で追加したログファイルとかで、実ファイルもシンボリックリンクもない場合はハマる。
実ファイルがシンボリックリンクに変わった場合
$ rm -fr ~/oreno-tmp && cd ~/oreno-tmp $ date > tailme $ tail -F tailme & Mon Jul 28 21:07:06 JST 2014 $ date >> tailme Mon Jul 28 21:07:54 JST 2014 $ ln -sf real-file tailme tail: `tailme' has become inaccessible: No such file or directory tail: cannot watch `tailme': No such file or directory $ date >> real-file $ date >> real-file $ date >> real-file # tail -Fから流れてこない