プログラムの自動実行(cron)について

Linuxを(特にサーバーとして)使っていると定期的に行いたい処理が結構あるものです。一番良い例がバックアップですよね。

Linuxではこうした自動実行をcrondというサービスが一手に引き受けています。

ここではサーバーをバックアップするついでに、cronの使い方メモを書きます。

なお、crontabの記述方法はmanページに詳しく説明されているので、ここでの説明は割愛します。
jman -a crontab (vineの場合です。他のデストリビュージョンではmanを使うと思います) でcrontab関係の説明が次々に表示されます。「q」を押すとmanページは閉じます。


2つの設定方法

プログラムを自動実行するにはcronの設定が必要ですが、この設定方法には2種類あります(もしかしたら、もっとあるかも)。

  • /etc/crontabを編集する方法
  • ユーザーごとのcrontabを編集する方法

以下ではそれぞれの方法について、設定方法を書きます。どちらか1つの設定をすれば、プログラムは自動実行されます。

うちでの使い分けは、システムの全体的な更新作業には「/etc/crontabの編集」をしています。ですから、全データのバックアップなどはこの方法にしています。
たとえば、特定のユーザー用の自動実行は「ユーザーごとのcrontabを編集」でやっています。たとえば、特定のユーザーのtmpファイルを削除するような場合、この方法にしています。
特別なルールがあるわけではありませんので、それぞれ自分の使い勝手を考慮の上、決めてください。


バックアップ・スクリプトの準備

このページで使うバックアップ用スクリプトを準備しましょう。

次のスクリプトは私が使っているものの抜粋です。これに手を入れて各自、スクリプトを準備してください。私もLinux Magazineを参考にしてスクリプトを作りました。

たとえば、/home/sg/bin/backup.shという名前で保存してください。

#!/bin/sh

# Restore tar xpzf /mnt/bac/*.tar.gz

# バックアップ保存日数
keepday=4

# 保存先ディレクトリ名
dest=/mnt/bac

timestamp=`date +%Y%m%d`
old_date=`date "-d$keepday days ago" +%Y%m%d`

# バックアップを行うサブルーチン
# backup src backfile
#  src=バックアップ元ディレクトリ名
#  backfile=バックアップ後ファイル名
function backup {
    bkfile=$dest/$2.$timestamp.tar.gz
    tar cpzf $bkfile $1 >/dev/null 2>&1
    if [ $? != 0 -o ! -e $bkfile ]; then
        echo "バックアップに失敗しました($bkfile)"
        exit 1
    fi

    rmfile=$dest/$2.$old_date.tar.gz
    if [ -e $rmfile ]; then
        rm -f $rmfile
    fi
}

backup /etc etc
backup /home/sg home.sg

このスクリプト例では、/etc以下を「/mnt/bac/etc.20030205.tar.gz」というような名前でバックアップされます。

ファイルを作成したら、chmod 700 /home/sg/bin/backup.shなどとして、実行できるようにします。
cronに登録する前に、このスクリプトを実行して正常にバックアップが出来るか確認&デバックしておいてください。
$ su
# /home/sg/bin/backup.sh


root宛てのメールを自分宛てに送るように設定

crondでは、標準出力の内容がメールで自動的に送られてきます。ですから、たとえばバックアップに失敗したら自分宛てにメールを送ってもらうようにできます。

しかし、以下で書いている「/etc/crontabを編集」の方法では、root宛てにメールが送られるので自分宛に送ってもらうようにaliasesを設定しておきましょう。

  1. rootになります。
    $ su
  2. /etc/aliases を編集します。たとえば、以下のようにすればroot宛てのメールはsgへ届きます。
    root: sg
  3. 変更したメール・エイリアスを適用します。
    newaliases

/etc/crontabを編集

  1. suでrootになります。
    $ su -
  2. エディタで/etc/crontabを編集します。次のような行を最後に追加します。この例では毎日AM5:12に、自動的にバックアップされます。
    12 05 * * * root /home/sg/bin/backup.sh
  3. crondを再起動します。
    /etc/rc.d/init.d/crond restart

後は、明日を楽しみに待ちましょう。明日朝には自動的にバックアップされているはずです。


ユーザーごとのcrontabを編集

  1. まず、利用するエディタを設定しておきます。標準ではviになっているようですが、viはたいへん操作が難しいので、ここではgeditを使って設定することにします。
    $ export EDITOR=/usr/bin/gedit
    このように、crontabは環境変数EDITORに設定されているエディタを起動する仕組みになっているようです。
  2. crontabの設定を行います。
    $ crontab -e
  3. crontabは最初はからっぽなので、/etc/crontabを参考にして次のように書きましょう。この例ではPM11:43にスクリプトが実行されます。
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
    MAILTO=あなたのユーザー名
    
    43 23 * * * /home/sg/bin/backup.sh
    

ユーザーごとのcrontab設定では、いちいちcrondを再起動する必要はありません。ファイルを保存しただけで自動実行されるようになります。

なお、今回の例では/etc以下をすべてバックアップしているので、アクセス・パーミッションの関係で、一般ユーザーのcrontab設定ではうまくいかないかもしれません。rootになってから設定する必要があるかもしれません。

このように、crontabは定期的にプログラムやスクリプトを実行させたいとき、たいへん便利です。うちのサーバーは深夜にcronから起動されるプログラムがたくさんあります。

Copyright©2001-2017 釣ったよ! All Right Reserved.    sg@tsuttayo.jpn.org