cronの設定を変えようとcrontab -e と打とうとして、間違ってcrontab -r と打ってしまい、cronの設定が根こそぎぶっ飛んで参りました。「eとrは隣同士だから不慮の事故ですよ!」という他人の言い訳は以前から良く聞いていて、心の中で「そんなことあるかよ!」と思っていましたが、まさか自分がやってしまうとは思いませんでした。まったく言い訳できません。
そして、こういう事故は絶対やってはいけないアカウントでやってしまうのが世の常。今回も例に漏れずたくさんジョブが仕込んであるアカウントでやってしまいました。しばし茫然自失。気を取り直してなんとかしようと考え始めたものの、さすがにこれを記憶に頼って復旧させるのは至難のワザ・・・・・・というかぶっちゃけ無理。適当に復旧してちゃんとバッチが動かずに、後日障害で呼び出されるものイヤです。
済んでしまったことでくよくよしていても仕方が無いので、手動での復旧はあきらめ、/var/log/cron の実行ログからcrontabをサルベージする*1スクリプトを書いてみました。本当は時刻の設定とかも復元できるようにしようかと思ったのですが、まぁそんなにお世話になることもないのでそのあたりは手動で実施するということにします。いちおうリストアップされるようにしました。ユニークに出力する(*/5みたいに綺麗に畳んだりできない)ので出力は結構冗長ですが、そこは勘弁してください。
こんな感じで、対象のログファイルとユーザーが指定できるようにしてみました。
/var/log/cronが読める必要があるので、基本的にはrootユーザーで実行する必要があります。
こんな感じで、crontabが復元されるので、cron.(daily|hourly|weekly)に設定されている部分など、不必要な部分を除いてやればよいと思います。まぁ、対象がrootでなければ余計なものはあまり出てこないと思いますが。
† cron_salvage.rb
突貫で作ったので、やっつけ気味です。
やっぱり時、分だけリストアップするようにしました。
ソースは GitHub からダウンロードできます。
† crontabのバックアップをする
今回の件で懲りたのでcrontabのバックアップを定期的に取るようにしました。やり方的には /var/spool/cron/(username) を取るか、crontab -l の結果をリダイレクトる2通りが考えられるのですが、どちらがメジャーなんでしょうかね。
ちなみにコマンド部分で%を使おうとしてハマったのでこちらもメモ。
昔、コマンド指定でdateがどうしても使えなくて困った記憶があるんだけど、おそらくこれが原因だろうなぁ。
Manpage of CRONTAB
「第 6」フィールド (行の残りの部分) には実行されるコマンドを指定する。その行のコマンド部 (改行文字または % 文字まで) が /bin/sh (またはその crontab ファイルの SHELL 環境変数で指定されたシェル) によって実行される。コマンド中にパーセント記号 (%) がバックスラッシュ (\) によってエスケープされずに置かれていると、改行文字に置き換えられ、最初に現れた % 以降の全てのデータは標準入力としてコマンドに送られる。
† 2009/11/24追記
2009-11-24 - (rubikitch loves (Emacs Ruby CUI))
しかし、こんなスクリプトを書いたり、いちいちcrontab -lで確認したりする必要はない。たんに「crontab FILENAME」を実行すればそのファイルをcrontabに登録してくれる。
俺の場合、 ~/.crontab というファイルを作成し、保存と同時に登録するようにしている。
なるほど。そうか、入れてからバックアップを取るんじゃなくて、ファイルを作ってから放り込めばいいのか。考え方の順序が逆だった。
リポジトリ入れておけば、更新のログも取れて一石二鳥だし。
そんなワケで僕の苦い経験が皆様の他山の石になれば幸いです。
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/3303
本日誤って crontab を消してしまい、cron_salvage.rb 活用させていただきました。助かりました。
なお、時、分の取得がうまくいっていなかったので、29 行目は [2..3] を [1..2] に変えて使用しました。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。