Hatena::ブログ(Diary)

ろば電子が詰まっている

2012-07-11

crontab -e は「絶対に」使ってはいけない

今までナチュラルにcrontab -eでcron編集をしていたのだけど、実はこれはとてつもなく危ないやり方だった。ということを、今さら知った。

crontab -rの恐怖

crontabコマンドにはrオプション(Remove)があり、これを実行すると何の警告もなく全てが消え失せる。

macbook:~ ozuma$ crontab -l
15 * * * * /home/ozuma/bin/hoge.sh
0 9 1 * * /home/ozuma/bin/piyo.sh > /dev/null 2>&1
*/5 * * * * /home/ozuma/bin/fuga.sh > /dev/null 2>&1
macbook:~ ozuma$ crontab -r
macbook:~ ozuma$ crontab -l
crontab: no crontab for ozuma
macbook:~ ozuma$

これを知った時は、今まで何気なくcrontab -eしていたことを思い出して背筋が寒くなりましたね……eとrなんてすぐ隣なんだから(今すぐ君のキーボードを確認してみよう)、ミスタイプする可能性もとても高い。

crontabの正しい運用方法

これは、組織や会社、団体ごとに違った方針があると思う。そこでここでは、いくつかのパターン(というか宗派)を紹介する。

ユーザごとのcrontabなんて一切ダメだよ派

この場合、各ユーザごとのcrontabを作ることは許さない。過激な管理者(そう、あいつだあいつ)なら、/var/spool/cron の中を毎日消しに来るかもしれない。

ユーザは管理者にお願いして、/etc/crontabファイルに直接書いてもらうか、/etc/cron.dフォルダに放り込んでもらうことにする。(この2つのどちらにするかで、また宗派が分かれる)。このため、ユーザはシステム管理者と仲良くなっておく必要がある。たまにはランチに誘ってみるのも良いだろう。

/etc/crontabなどシステムのcrontabファイルは、ユーザごとのcron設定と違って、6フィールドめに実行ユーザを書くことになっている。

30 2 * * * ozuma /home/bin/hoge/fuga.sh

これで、ozumaさんから依頼のあったfuga.shを、毎日2時30分に実行できる。


crontabコマンドを作り替えちゃえよ派

この宗派は、/usr/bin/crontab をシェルスクリプトのラッパーで置き換えて、ラッパーの中で-rオプションを付けられていても消して無視しちゃったり、強制的に-iオプション(確認)を付けたりする。

しかし、OSのシステムコマンドに手を入れるわけで正直微妙だと思うし、iオプションはLinuxのみ(BSD/Solarisには無い)ので、採用すべきでないと思う。


crontabは-eを禁止して、常に外部ファイルを読み込ませればいいよ派

crontabコマンドは、オプションを付けずに引数を与えると、その指定されたファイルを読み込んで設定される。

$ crontab cron.txt

これで、cron.txtに書かれた内容が設定される。だから、crontab -eで設定することは禁止して、常にこの形式で行うことにすれば、-eオプションを付けることが無いわけだから-r事故も起こらない。この場合、~/etc/crontab とか作っておいて、それを読み込ませる、とすると良いだろう。(ヘタに-lオプションを使うと事故る危険があるから、-lで吐いてそれを加工、はしないようにする)。

$ vi ~/etc/crontab
(新しくcrontabに追加する行を設定)
$ crontab ~/etc/crontab

そして、各ユーザの~/etc/crontabファイルと、念のため/var/spool/cron/(ユーザ名) をバージョン管理しておけば完璧だろう。


消しちゃった! どうしよう

と、色々やっていてもやっぱり消しちゃう事故が起きたら。

システム全体のバックアップがあるならば、/var/spool/cron/(ユーザ名) というファイルに書かれているのでこのファイルを復旧すれば良い。

バックアップが無いならば、/var/log/cron にcronの実行ログが出ているのでこれを目で見て、手動でcrontabを復旧しよう。/var/log/cronからのサルベージ援護スクリプトを公開されている方もあるようです(crontab -r とやってしまった時の対処法)。

Good luck!

laclefdorlaclefdor 2012/07/23 23:51 ユーザーレベルで-e使ってちょこっとcronを回すのはいいんじゃないかな。
間違って-r打っても自分のcronが消えるだけだし。
私自身-rの事は知らなかったけど、間違って消したことは一度もない。

業務用アカウントなら、-eを使うのは手動で設定しているという意味で論外。
何らかの手段で自動化しないとスケールしない。

haha 2012/07/24 12:47 実は数日前に、経験の浅い後輩に-rやられちゃいました。-lを忘れてしまって「あれ、-rじゃなかったっけ?」。。。。。orz

nnsnns 2012/07/24 13:06 リリース手作業のところがまだあるんだ・・・
今日も平和だなぁ〜

DW_LeeDW_Lee 2012/07/25 07:49 Solaris だと、/var/spool/cron/crontabをディレクトリごとバックアップしてからメンテナンスする方法も…

kozakoza 2013/01/11 09:47 -r とやったのは私です。バックアップも無かったので、ログと設計書から必死に戻しました。
他システムとの連携ジョブまでになんとか修正完了、事なきを得ました。ふ〜っ。
本当にあぶないっす!

morumoru 2013/03/25 10:40 個人的にずっと-eだけど、彼是15年近くLinuxを使うが、未だ-rを意図せず使った事はない。
業務で使う時はスクリプトで流すのでそちらでは予行演習含め、以前の使いまわしだからやはりミスを起こす事は考え辛い。見出しは注目されたいからとしか思えない。

NNNN 2013/04/29 20:12 -iオプションをaliasに設定すれば良いんじゃないでしょうか?

774774 2014/08/12 16:08 -i オプションをエイリアスに設定なんかしたら、エイリアスを設定してない環境でうっかり crontab -r したときに一発で消えて死にますよ。

arachansanarachansan 2014/08/29 12:16 追加は
$cron settings.txt
でいいとしても不要なcronの設定はどうするのでしょうか?
直接弄ることはできないので、
$cron -e
せざる得ないのでは?

nananana 2014/09/16 13:58 >追加は
>$cron settings.txt
>でいいとしても不要なcronの設定はどうするのでしょうか?
>直接弄ることはできないので、
>$cron -e
>せざる得ないのでは?
バックアップ的な意味合いも兼ねて、外部ファイルを編集して追加設定しましょう
ということなんでしょうかね。
根本的な解決法ではなく、結局削除時cron -eを使うことに変わりないわけなんですが・・・

zzzzzz 2015/08/10 20:20 ↑の2つ、そもそも勘違いしてる気が。。。

$ crontab cron.txt
で同期されるので、行を削除したい場合はcron.txtから該当行を削除して、もう一度コマンドを実行すれば良いだけでは。

doruondoruon 2015/12/18 09:11 消さないことより消しても大丈夫にすること考えましょうよ……
単にcrontab -l > crontab.txtみたいなのをcrontabに書いとくだけじゃないですか

tttt 2016/02/10 15:31 linuxのコマンドは、やるべき内容をExcelのセルに入れて、コピペで実行すると間違えなくて良いですよ。
10年以上使っていますが、打ち間違いはしたことがありません。
(間違うのは、Excelには書いておかない、エコーもされないパスワードぐらいですね)

kk 2016/04/24 07:12 crontab には @hourly run-parts $HOME/.cron.hourly とかしか書かなければよい

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

リンク元