cronolog -S

cronolog の usage には

usage: cronolog [OPTIONS] logfile-spec
(snip)
   -S NAME,   --symlink=NAME  maintain a symbolic link from NAME to current log

とか書いてあるのに、うちの環境では、古い symlink がリンク切れのまま放置されてるのをよく見かける。で、ソースを読んでみたところ、

void
create_link(char *pfilename,
            const char *linkname, mode_t linktype,
            const char *prevlinkname)
{
    struct stat         stat_buf;
    if (stat(prevlinkname, &stat_buf) == 0)
    {
        unlink(prevlinkname);
    }
    if (stat(linkname, &stat_buf) == 0)
    {
        if (prevlinkname) {
            rename(linkname, prevlinkname);
        }
        else {
            unlink(linkname);
        }
    }

と書いてあった。

俺の場合、ログファイルの切り替えを見計らって cron で古いログを gzip してるのが原因だったようだ。cronolog の create_link() が cron job より遅れた場合、stat() に失敗した結果、古いリンクが unlink() されずに新しい symlink が作れなかった、ということらしい。

つか、lstat() 使うべきだよなあ。ここは。