I&U Home > うにまま(仮)

【PR】UNIXサーバ管理を任されたら・・・これを読もう!

・・・すごく気になる・・・


■■ crontab ■■

定期的に行う必要のある作業は crontab を使えば忘れることがありません。

crontab のシンタックスとオプション

        crontab [ filename ]
        crontab [-elr] [username]

-e           crontabを編集する。環境変数EDITORで指定したエディタで編集する。EDITORがセットされていなければ ed(1)を使用する。*
-l crontabの内容を表示する
-r crontab ディレクトリからユーザーの crontab を削除する

linux には特定のユーザを指定する -u オプションがありますが、solaris にはありません。
username 指定は root だけができますが、su - で username になってから操作した方が安全です。

* ed はさすがに辛いのでせめて vi ぐらいにしておきましょう。

アクセス制御

アクセス制御は説明するとごちゃごちゃしてしまうのでやめておきますが、solaris2.X 以前と solaris8 以降では大きく異なります。

伊東四郎曰く、「できるものはできる!」

solaris2.X 以前 /etc/cron.d/cron.allow と /etc/cron.d/cron.deny による制御
solaris8 以降 Role-Based Access Controlによる制御

crontab の記述形式

crontab は空白またはタブで区切られた6つのフィールドから成ります。
最初の5つが起動時刻に関するもの、最後の1つが実行するプログラムです。
#で始まる行はコメント行です。

     分 (0-59)
     時 (0-23)
     日 (1-31)
     月 (1-12)
     曜日 (0-6、0 は日曜日)

私のcrontabを公開します
me[167]% crontab -l
# 毎週火曜日の12:10にback up用のテープをチェックしろ!とメールします。
10 12 * * 2 mailx -s"Check the backup tape" me@mydomain < $HOME/message.jis
# 毎日5:00 に CGI で使用したテンポラリファイルを削除します。
# del_oldfile.plは指定したディレクトリ配下で N 日以上前に作成されたファイルを
# 削除する自作スクリプトです。
0 5 * * *  $HOME/cron_script/del_oldfile.pl $HOME/public_html/cgi-bin/tmpoutdir 2
# 月曜日の 1:00に SWISS-PROTをミラーします。
0 1 * * 1 /work/DB/tools/mirror/swiss_update
# 日曜日の 1:00に PIRをミラーします。
0 1 * * 0 /work/DB/tools/mirror/pir_update

rootの crontab は以下のようなものを入れてます。
10 3 * * 0,4 /etc/cron.d/logchecker
10 3 * * 0   /usr/lib/newsyslog
15 3 * * 0 /usr/lib/fs/nfs/nfsfind
1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1
30 3 * * * [ -x /usr/lib/gss/gsscred_clean ] && /usr/lib/gss/gsscred_clean
10 0 * * * /usr/local/apache/cron_script/http_log_check 
# スプールに貯まった一時ファイルの削除
0 0 * * * find /var/spool/samba -atime +1 -exec rm {} \;
# ntp で時間合わせ
0 1 * * * /usr/sbin/ntpdate ntp1.mydomain > /dev/null 2>&1

crontabの記述に関する小ネタ

標準出力、標準エラー出力のリダイレクト

    crontabに記述されたプログラムが実行されるときは端末は繋がっていないので、端末に表示されるメッセージ(標準出力、標準エラー出力)は crontab の所有者に対してメールで送信されます。 これが嫌な場合には、出力を /dev/null にリダイレクトして捨ててしまいましょう。

    逆に、crontabに記述したコマンド列やスクリプトが正常に動作しているかどうかわからないときは、メール送信機能を使うことによってスクリプトの動きを記録することができます。

起動日の工夫

    croontabの記述形式でも説明しましたが、crontabでは毎週のある曜日や、月のうちの何日という指定はできますが、第1月曜というような指定はできません。 毎月第4金曜日にだけ、ダウンロードしたいデータがあるので、金曜日に実行するダウンロード用スクリプトに以下のようなスクリプトを組み込んでいます。
    (perlスクリプトです。念のため。)
    $mday = (localtime time)[3];
    $w = int(($mday-1)/7)+1;
    if( $w != 4 ) { exit; }
    


2002.12.30