シンボリックリンク絡みで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から流れてこない