crontabを誤って削除しないための対策と削除してしまった時の対処方法まとめ

シェル

こんにちは。Enjoy IT Life管理人の仁科(@nishina555)です。

開発現場ではcrontabを操作する機会が多いと思います。
一般的なcrontabの操作方法としては『対象のサーバーにログインし、crontabコマンドを利用する』というものではないでしょうか。

しかし、crontabは少し間違えるとオペレーションミスにつながるタチの悪いコマンドでもあります。

そこで今回はcrontabを安全に操作する方法、またオペレーションミスをしてしまったときの対処方法について紹介をします。

crontabについて

crontabとは定期的に実行されるジョブ(スクリプトやコマンドなど)のスケジュールを管理するコマンドのことです。

crontabによって記述されたスケジュールをもとにcrondと呼ばれるデーモン(サーバーのバックグラウンドで動作しているプロセス)がジョブを実行します。

crontabでは以下のオプションが用意されています。

オプション 意味
-u ユーザー指定
-r 削除
-l 閲覧
-e 編集

crontabを直接操作するのは危険!

『crontab -r』はcrontabの内容を削除するコマンドです。そして、この削除コマンドは「本当に実行しますか?」といった確認なしに即実行されます。

そのため、crontabを直接開く・編集するというのはオペレーションミスにつながる可能性があります。

たしかに、crontabの操作のほとんどは閲覧(-l)と編集(-e)だけですので、オペレーションミスをする可能性はきわめて低いです。

とはいえ、手動で操作するかぎり絶対に間違えないという保証はどこにもありません。

crontabを安全に操作する方法まとめ

crontabを安全に操作する方法はいくつか考えられます。例えば以下のような方法です。

crontabを安全に操作する方法
  • crontabの内容をgitで管理する
  • crontabの内容をファイルに出力させ、そのファイルに対して操作を行う
  • 『crontab -r』を実行する前にユーザーに確認を促すようにする
  • 『crontab -r』を実行できないようにする

以下では上記の方法について詳しく紹介をしていきたいと思います。

crontabの内容をgitで管理する

一番かんたんかつ確実な方法だと思います。
crontabは直接crontabコマンドでファイルを編集しなくても、外部ファイルの内容を登録することができます。

ですので、crontabの設定ファイルをgitでバージョン管理するとよいでしょう。

### crontab.txtの内容をcrontabに登録
$ crontab crontab.txt

crontabの内容をファイルに出力させ、そのファイルに対して操作を行う

crontabを安全に扱うにはgitを利用したバージョン管理が確実ですが、一時的に微修正をしたいときなどもあります。

一時的な変更を行う場合もcrontabを直接編集するのは避けたほうがよいです。
その代わり、crontabの内容を一旦ファイルに書き出し、そのファイルに対して操作を行う方法をとるとよいです。

具体的な手順は以下のようになります。

### 現在のcrontabの設定をファイルに書き出し
$ crontab -l > crontab.org
$ crontab -l > crontab.edit

### ファイルの編集(実行時間などは既存のものとあまり重複しないようにする)
$ vi crontab.edit

### 現在のcrontabと編集したファイルのdiff確認
$ crontab -l | diff crontab.edit -
→ 自分が編集した部分だけdiffに出ればOK

### crontab登録 
$ crontab crontab.edit

### crontab確認
$ crontab -l
→ 自分が登録(削除)した部分がちゃんとcrontabに反映されていることを確認

### ファイルの削除
$ rm crontab.org crontab.edit

もし、現在のcrontabの状態をバックアップファイルとして保存しておきたい場合は以下のようにするとよいでしょう。

### バックアップ
$ crontab -l > crontab.`date "+%Y%m%d%H"`
→ crontab.2019030310のような名前のファイルが作成される


### 戻し作業
$ crontab crontab.`date "+%Y%m%d%H"`
→ crontab.2019030310の内容がcrontabに登録される

なお、dateコマンドを利用したバックアップファイルの作成方法については『タイムスタンプのついたバックアップファイルを簡潔に作成する方法』の記事で紹介しているので、興味のある方はご覧になってみてください。

タイムスタンプのついたバックアップファイルを簡潔に作成する方法

『crontab -r』を実行する前にユーザーに確認を促すようにする

削除操作でよくみかけるやつです。

『本当に実行してもよいですか?』とユーザーに確認させるロジックを追加することで誤操作を防ぐことができます。

具体的にはシェルの設定ファイル(.zshrcなど)に以下のfunctionを追加します。

function crontab () {
    if [ "$1" = "-r" ]; then
        echo "really delete crontab?[y/n]"
        read answer
        if [ $answer = "y" ]; then
            command crontab -r;
            echo "deleted!"
        fi
    else
        command crontab "$@";
    fi
}

『crontab -r』を実行できないようにする

『crontabの情報をファイルに書き出す』もしくは『crontabの内容をgitで管理する』で安全にcrontabを操作することができます。

また、削除操作を対話形式にすることで誤ってcrontabの内容を削除してしまう可能性はかぎりなくゼロになると思います。

しかし、もとはといえばcrontabの削除コマンドが存在しているのが根本的な問題です。

『crontab -r』という削除コマンドを実行する機会はほとんどないと思うので、『-r』のオプションを実行できなくしてしまうという手があります。

以下のようにすることで、削除コマンドが実行できなくなります。

function crontab () {
    if [ "$1" = "-r" ]; then
      echo "forbidden!!";
    else
        command crontab "$@";
    fi
}

『crontab -r』でcrontabの内容を削除してしまったときの対処方法

バックアップやバージョン管理もしておらず、crontabの内容を間違って削除してしまったとします。

この場合、crontabの内容を復元する必要が出てくると思います。
crontabの内容を元に戻す方法としては以下の2つの方法があります。

crontabの内容を元に戻す方法
  • 『/var/spool/cron/${ユーザ名}』(Macの場合は『/usr/lib/cron/tabs/${ユーザー名}』)にキャッシュされているcronの実行ファイルから復元
  • 『/var/log/cron』に出力されているcronの実行ログから復元

まとめ

以上でcrontabを誤って削除しないための対策と、誤って削除してしまった時の対処方法の紹介について終わります。

オペレーションミスは人が操作するかぎり経験年数によらず発生するリスクがあります。
crontabはオペレーションミスがおきやすい操作ですので、今回紹介した対策方法を導入してみてはいかがでしょうか。

この記事がいいなと思いましたらツイッター(@nishina555)のフォローもよろしくお願いします!