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() 使うべきだよなあ。ここは。