今日の自分を支える 技術→マネジメント

技術職→管理職になりました

cronログが突然出力されなくなった時に役立つ技術

現象

ある日突然、開発環境の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

そんなことなかった。
そもそもファイルに拡張子が付いているので、ファイルを直接編集しているわけではないのかな。

scrapbox.io


  1. 標準出力、標準エラー出力がないとメール送信されません。