CRONが動かない!Error: bad username; while reading /etc/crontabと吐いた。SSLの更新設定のときにやらかしていた。

ある日の朝、クライアントから「サイトが見れませんよ」と連絡がきた。アクセスしてみるとたしかにダウンしている。どうやらDNSが切れたようだ。IPを辿っていってもそれがわかった。DNSを更新したら復旧した。
原因は不明なので、クライアントのサイトは別の環境に移して対応。とりあえず事態は収まった。

原因究明
DNSがなぜ落ちたのかを辿る。DNSの変更ログを見てみると、ここ1週間まるで更新されていない。1週間前にSSLの設定とPostfixの設定をやりまくったばかり。DNSとSSLとPostfixの接点があるとすれば、、、

・SPF、DKIM、DMARC、Google postmasterの設定をDNSに行った。
・SSLの更新をCronに記述した。

そう、CronでDNSサーバーに更新通知をやらせていたのだけれど、それが滞れば、今回のようにDNSサーバーが落ちるわな。ちょうど1週間だ。まったくもって理屈は適う。
1週間前にこのサイトを参照してSSLを設定した。とても参考になりました。レムシステムさん、ありがとうございます!!

https://www.rem-system.com/mail-postfix03/
00 3 * * * certbot renew -q --deploy-hook "systemctl restart postfix dovecot"
00 5 * * * certbot renew -q --deploy-hook "systemctl restart postfix dovecot"

これをまんまコピペしていたんだけれど、なにがいけないのか。この記述自体がいけないのではなくて、自分の環境にあっていなかったというのが結果だ。

・UBUNTUサーバーを使用という条件で

Cronがちゃんと動いているのか調べてみた。

sudo systemctl status cron

結果が出てきてもとくにわからん…。とにかくCronを再起動してみっか。

sudo systemctl restart cron

cron[20467]: Error: bad username; while reading /etc/crontab

うおおー、赤い字でエラーが!「bad username」とも出ている!「悪ガキの名前」とでも言うのか!とにかく実行するユーザー名が間違っているっていうことかな?
たしかにCronで他に設定したものには「root」で実行するように記述してある。

00 3 * * * root certbot renew -q --deploy-hook "systemctl restart postfix dovecot"
00 5 * * * root certbot renew -q --deploy-hook "systemctl restart postfix dovecot"

とrootを追記して、Cronを再起動。

sudo systemctl restart cron

エラーが解消された!ということはUbuntuのCronでは、実行するユーザーを明示した記述でないといけないってことかな。よし、わかった!
このエラーによって、Cronが全体的に実行されていなかった、ってことだね。それでDNSも落ちちゃったってわけ。
これで全て完了、と言いたいところだが、これが実際にうまく動くかどうかは1日経ってみないとわからない。ログがメールに出力されるように、

00 3 * * * root certbot renew -q --deploy-hook "systemctl restart postfix dovecot" | mail -s 'SSL Check 3:00' username
00 5 * * * root certbot renew -q --deploy-hook "systemctl restart postfix dovecot" | mail -s 'SSL Check 5:00' username

と追記。これで明日の午前3時まで待てばOK。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA