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オプションが無効化できた。

いやー。焦った。

参考


Related #raspberry pi