現象
ある日突然、開発環境のcronログが出力されなくなりました。
cron機能が死んだ??と思って調べることに。
調べたこと
cronデーモンの確認
$ps -ef | grep crond
もちろん起動中。
cronログ出力設定の確認
$cat /etc/rsyslog.conf -- 出力結果 -- # Log cron stuff cron.* /var/log/cron
コメントアウトされていないので、ログは出力されるはずです。
MAIL設定
MAILTO=""
MAILTOにメールアドレスを設定して、cronが起動されたらメールが飛ぶように設定。
が、起動されるshellのほうで標準出力を握りつぶしていたのでメールは飛びません。1
cronで起動されるジョブのログを確認
ありました...。
つまり
「crondは動いていて、ジョブは起動されているけど、cronログは出力されない」
状態のようです。
解決策
「cron ログ 出力されない」で調べても解決しなかったのと
開発環境だったので「エイヤ」でrsyslogを再起動しました。(よくない)
$service rsyslog restart
なおった!!!
原因
その後数日して事象が再発したので、原因について調査することに。
どうも後輩がcronを設定してテストしはじめるとログが出力されなくなっている。
もしや...?と思い事情聴取すると
「vi」コマンドでcronのログを開き、保存して閉じていたらしい。
Linuxを初めて触る人にはviコマンドの「:q」を先に教えようと思った。
追加調査
rsyslogがcronログを更新できない状態かどうかを確認できる方法を探してみた。
cronログ手動更新前の状態
プロセスID、プロセスが開いているファイルを確認
$ ps -ef | grep rsyslog $ls -l /proc/[プロセスID]/fd -wx------ 1 root root 64 11月 8 18:19 6 -> /var/log/cron
cronログを手動更新後の状態
$ vi /var/log/cron 適当に編集して保存 $ls -l /proc/[プロセスID]/fd l-wx------ 1 root root 64 11月 8 18:19 6 -> /var/log/cron~ (deleted)
viで編集してしまうとrsyslogはcronログを見失ってしまうようです。
ちなみにtouchでは(deleted)にはなりませんでした。
余談。
これって、2人の人がviコマンドで同じファイルを編集したときも同じなのかな?
と気になったので確認。
$ ls -l /proc/[プロセスID]/fd/ rwx------ 1 root root 64 11月 8 18:35 4 -> /home/tatsuhi10/.test.swp $ ls -l /proc/[プロセスID]/fd/ rwx------ 1 root root 64 11月 8 18:35 4 -> /home/tatsuhi10/.test.swo
そんなことなかった。
そもそもファイルに拡張子が付いているので、ファイルを直接編集しているわけではないのかな。