今やらかしたのでメモ。
crontab -eで編集しようとしたら、指がちょっと伸びすぎてcrontab -rをしてしまい、でもなんかコマンドが通ったな?と思って改めてcrontab -eをしたら、きれいなデフォルトのcrontabが目の前に現れました。あ、これやっちまったな?
- rは/var/spool/cron/crontabs/<ユーザー名>のファイルを「確認もなく」消し飛ばすだけのオプションらしく、そんなもんエディターとかrmで消しゃいいだろとしか思えず、どう考えても必要のないオプションのような気がします。設計した人間頭沸いてるだろ。なぜコミュニティで反対されなかったのか。systemd-timerdへの移行を促すための嫌がらせ的に実装でもされたのか。
グチを言っても再発防止を考えてもしょうがないのでひとまず復旧させました。
ラズピッピなので環境はDebianです。/var/log/syslogにcronの実行ログが1週間ぶん蓄積されるので、これをzgrepしていけば良いと思います。コメントは帰ってこないけど、まあ良いでしょう。もしコメントレベルで復元したければ、今すぐ電源を切って別のマシンでextundeleteを実行するとか、そっち方向の対処になろうかと思います。
$ zgrep CRON /var/log/syslog.* | less
この中から、実行時間と実行スクリプトを抜き出してメモしていきます。毎分・毎時間でたくさん出力されるものについては、メモったあとはgrep -vで除外すれば良いです。
$ zgrep CRON /var/log/syslog.* | grep -v cron.hourly | less
syslogファイルを当日とか前日だけでgrepすると、特定曜日だけ実行のジョブを忘れるので注意でした。
どうすれば良いのか
やらかし後、crontab -eは危険なのでcrontab /var/spool/cron/crontabs/<ユーザー名>せえ、とか、/etc/cron.dをつかえとか、色々流れてきましたが、まあsystemd-timerdに移行とかなんでしょうかねえ。
でもイヤですね、crontab -eで雑に編集できるのがやっぱり楽。crontabでcrontabをバックアップすれば良いんじゃないっすかね(???)
# backup crontab * 0 * * * crontab -l > /home/pi/crontab.backup