Movatterモバイル変換


[0]ホーム

URL:


BLOGTIMES

cles::blog

平常心是道
« :: »
2009/11/21

crontab -r とやってしまった時の対処法

  linux  sh  ruby 
このエントリーをはてなブックマークに追加

cronの設定を変えようとcrontab -e と打とうとして、間違ってcrontab -r と打ってしまい、cronの設定が根こそぎぶっ飛んで参りました。「eとrは隣同士だから不慮の事故ですよ!」という他人の言い訳は以前から良く聞いていて、心の中で「そんなことあるかよ!」と思っていましたが、まさか自分がやってしまうとは思いませんでした。まったく言い訳できません

そして、こういう事故は絶対やってはいけないアカウントでやってしまうのが世の常。今回も例に漏れずたくさんジョブが仕込んであるアカウントでやってしまいました。しばし茫然自失。気を取り直してなんとかしようと考え始めたものの、さすがにこれを記憶に頼って復旧させるのは至難のワザ・・・・・・というかぶっちゃけ無理。適当に復旧してちゃんとバッチが動かずに、後日障害で呼び出されるものイヤです。

済んでしまったことでくよくよしていても仕方が無いので、手動での復旧はあきらめ、/var/log/cron の実行ログからcrontabをサルベージする*1スクリプトを書いてみました本当は時刻の設定とかも復元できるようにしようかと思ったのですが、まぁそんなにお世話になることもないのでそのあたりは手動で実施するということにします。いちおうリストアップされるようにしました。ユニークに出力する(*/5みたいに綺麗に畳んだりできない)ので出力は結構冗長ですが、そこは勘弁してください。

$ ./cron_salvage.rb --helpUsage: cron_salvage [options] -f, --file CRONLOG cron log file (default: /var/log/cron) -u, --user USER cron user (default: root)

こんな感じで、対象のログファイルとユーザーが指定できるようにしてみました。
/var/log/cronが読める必要があるので、基本的にはrootユーザーで実行する必要があります。

$ ./cron_salvage.rb * * * * * /usr/lib/sa/sa1 1 1 * * * * * ionice -c3 nice -n 19 /opt/apache/htdocs/admin/AWStats69t_Jpn/wwwroot/cgi-bin/awstats.cron > /dev/null 2>&1 * * * * * run-parts /etc/cron.daily * * * * * run-parts /etc/cron.hourly * * * * * run-parts /etc/cron.weekly

こんな感じで、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 というファイルを作成し、保存と同時に登録するようにしている。

なるほど。そうか、入れてからバックアップを取るんじゃなくて、ファイルを作ってから放り込めばいいのか。考え方の順序が逆だった。
リポジトリ入れておけば、更新のログも取れて一石二鳥だし。

そんなワケで僕の苦い経験が皆様の他山の石になれば幸いです。

  • *1: ちなみにこの方法は僕が考案したわけではなく、以前にとあるプロジェクトで同様の事故が起きた際にある人が考えついた方法です。そのときは手動でやっていたのを脇目で眺めているだけでした。

byhsur at 20:27[5年前][4年前][3年前][2年前][1年前][1年後][2年後][3年後][4年後][5年後] |
こんな記事もあります 「cron サルベージ 不慮の事故
rclone で OneDrive の内容をサーバにバックアップ
安物の USB-UART を使おうとしたら PL2303HX だったので・・・
HFS Explorer を使って Windows から HFS+ のディスクを読み取る
SATA IDE USB 変換ケーブル
.eml ファイルから URL だけを抽出する
Ryzen 9 5900X の PC を組み立て
systemd から起動されているサービスを定期的に再起動する
python-o365 を使って O365 アクセストークンを取得する
crontab は曜日が名前で書ける
壊れた H2 DB のファイルを修復するには
トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/3303
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
通りすがり(2017/04/06 15:25) <%HatenaAuth()%>

本日誤って crontab を消してしまい、cron_salvage.rb 活用させていただきました。助かりました。
なお、時、分の取得がうまくいっていなかったので、29 行目は [2..3] を [1..2] に変えて使用しました。

Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL:Yahoo! JAPAN IDでログイン

« :: »
Copyright © 2004-2023 by CLES All Rights Reserved.
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 .アーロンチェアのポスチャーフィットを修理(99682)
2 .年次の人間ドックへ(99094)
3 .福岡銀がデマの投稿者への刑事告訴を検討中(99084)
4 .三菱鉛筆がラミーを買収(98693)
5 .2023 年分の確定申告完了!(1つめ)(98662)
最新のエントリ
cles::blogについて
誰が書いてる?
最近行った場所
サイトポリシー
タグ一覧
検索ワードランキング

Referrers

    Powered by CLES
    Nucleus CMS v3.31SP3/w memcached
    21375756(W:6381 Y:1545 T:1575)
    cles::blogのはてなブックマーク数
    benchmark


    [8]ページ先頭

    ©2009-2025 Movatter.jp