- blogs:
- cles::blog
crontab -r とやってしまった時の対処法
cronの設定を変えようと crontab -e と打とうとして、間違って crontab -r と打ってしまい、cronの設定が根こそぎぶっ飛んで参りました。
「eとrは隣同士だから不慮の事故ですよ!」という他人の言い訳は以前から良く聞いていて、心の中で「そんなことあるかよ!」と思っていましたが、まさか自分がやってしまうとは思いませんでした。まったく言い訳できません。
仕方が無いので、/var/log/cronの実行ログからcrontabをサルベージするスクリプトを書いてみました。本当は時刻の設定とかも復元できるようにしようかと思ったのですが、まぁそんなにお世話になることもないのでそのあたりは手動で実施するということにします。いちおうリストアップされるようにしました。ユニークに出力しますが、*/5みたいに綺麗に畳んだりできないので出力は結構冗長です。
Usage: cron_salvage [options]
-f, --file CRONLOG cron log file (default: /var/log/cron)
-u, --user USER cron user (default: root)
こんな感じで、対象のログファイルとユーザーが指定できるようにしてみました。
/var/log/cronが読める必要があるので、基本的にはrootユーザーで実行する必要があります。
* * * * * /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
突貫で作ったので、やっつけ気味です。
やっぱり時、分だけリストアップするようにしました。
require 'optparse'
require 'time'
opts = OptionParser.new
conf = Hash.new
conf[:file] = '/var/log/cron'
opts.on("-f", "--file CRONLOG", "cron log file (default: /var/log/cron)"){ |f| conf[:file] = f }
conf[:user] = 'root'
opts.on("-u", "--user USER", "cron user (default: root)"){ |u| conf[:user] = u }
opts.parse!
unless File.exist?( conf[:file] )
puts "logfile not found. (--file: #{conf[:file]})"
exit 1
end
cmds = {}
open(conf[:file]) do |file|
while line = file.gets
month, day, time, host, proc, user, op, cmd = line.split(' ',8)
user = user[1..-2]
cmd = cmd[1..-3]
next unless op == 'CMD' && user == conf[:user]
cmds[cmd] = {} unless cmds.has_key? cmd
cmds[cmd].store( (Time.parse("#{month} #{day} #{time}").to_a)[2..3].reverse, true)
end
end
cmds.each do |cmd, timing|
timing.keys.sort.each do |k|
hour, min = k
puts "#{min} #{hour} * * * #{cmd.gsub('%', '\%')}"
end
end
† 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が必要です→http://blog.cles.jp/item/3303
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
OpenID を使ってログインすることができます。
sp-20100209221611644595551@cles.net
- cron ログ
- Yahoo! - 10/02/08 13:17:35
- もみかえし 対処
- Yahoo! - 10/02/05 23:25:20
- もみかえし 対処法
- Yahoo! - 10/02/05 16:06:48
- crontab ログ 出力
- Google - 10/01/20 18:49:35
- cygwin crontab 実行
- Google - 10/01/20 11:18:53
- crontab CentOS
- Google - 10/01/20 10:42:15
- crontab nice
- Google - 10/01/19 18:10:35
- crontab 復元
- Google - 10/01/19 17:03:41
- ionice
- Google - 10/01/19 16:44:15
- cron 設定 バックアップ
- Google - 10/01/19 13:38:58
- crontab daily
- Google - 10/01/19 13:17:16
- crontab ログ
- Google - 10/01/19 10:16:00
- "crontab "
- Google - 10/01/18 08:01:21
- シェル crontab 結果がおかしい
- Google - 10/01/15 17:16:37
- crontab @weekly @daily
- Yahoo! - 10/01/15 16:58:01
- NP_Clap v1.7 (13)
- 今日こそいきたかったんだけど (8)
- もみかえし? (7)
- 2005年の人気エントリTop 100 (5)
- 論文モードのためしばしお休み (4)
- 達人プログラマー (4)
- Windows の自動インストール (4)
- 効果的な「なぜ」とは? (4)
- SQLite Optimizer Firefoxの... (4)
- メールの引用部分を折りたた... (3)
2 . やっぱりあった!パクれる読書感想文! [4301x]
3 . 芸能人の本名。 [3884x]
4 . 急性胃腸炎 [3858x]
5 . Echofon for Firefox [3398x]
- CD-ROM起動で、HDDを完全消去
- NP_Moblog v1.16
- pinzoro 01/15
- hsur 12/29
- and more...
- 耳がおかしいと思ったら突発..
- baca 01/13
- hsur 01/13
- and more...
★はてな認証APIをつかってログインすることができます。




