crontab -rで全消ししてしまった時の対応
RaspberryPiで動かしていたcron設定を誤って crontab -r
で全消ししてしまった。
Termuxを使ってスマホからsshで接続した際に文字が小さくtypoに気づかず実行してしまったのが原因。
個人用途の設定だったので大事にはならなかったが、実運用サービスでやってしまっていたらと考えると非常に怖い。
ログからの復旧と再発防止策を入れておいた。
ログからの復旧
rsyslogでcronのログを出力する設定にしてあれば /var/log/cron.log
にログが残っている。
/etc/rsyslog.conf
cron.* /var/log/cron.log
下記記事のcron_salvageスクリプトをお借りして、 ./cron_salvage -u user
でログから復旧可能なものを復元。
復元できたcron設定を ~/.crontab
に書き出し、このファイルをバージョン管理しておく。
復元できなかったものについては手動で追記。
crontab -eでの反映をやめて、外部ファイル読み込みでcron設定を反映するように変更。
crontab ~/.crontab
これでログからの復元が完了した。
e, rオプションの封印
そもそもrオプションを使いたくなる時がないので、rオプションを無効化する。
ついでにcron設定の反映を外部ファイル読み込みで統一するためにeオプションも無効化する。
下記記事を参考に、オプションを無効化したcrontab関数を追加。
function crontab() {
local opt
for opt in "$@"; do
if [[ $opt == -e ]]; then
echo 'crontab -e is sealed!'
return 1
fi
if [[ $opt == -r ]]; then
echo 'crontab -r is sealed!'
return 1
fi
done
command crontab "$@"
}
これでe, rオプションが無効化できた。
いやー。焦った。