cron anchor.png

cronは,Unix系OS(Linuxのような)で使用される,ジョブ(スクリプト)を自動実行するためのデーモンプロセスのこと。
Linuxや各種のサーバーで管理を行なう場合,ログのローテートや,バックアップ,定期的に自動実行したいジョブが数多くある。特に,バックアップなどはシステムへの負荷が大きいため,通常は,ユーザからのアクセスが少ない深夜や早朝に行なうようにすることが多い。

このように,定期的に実行されるジョブはcrondというデーモンによって,自動的に行なうように管理することが出来る。

Page Top

crontab anchor.png

crontab(クロンタブ)は,cronで管理される定時実行のスケジュール管理を行うために用いられるコマンドや定義ファイルのこと。

crontabには,各ユーザ毎の個人用の物と,システム全体用のものがある。もちろん,システム全体用の物は,システム管理者のみが編集可能になっている。

crontabファイルの各行は,空白またはタブで区切られたフィールド列から構成される特有の形式となっている。

Page Top

特殊記号 anchor.png

フィールド中で複数の値を指定するには,いくつかの方法がある。

  • コンマ(,)で値のリストを指定する
    例)"1,3,4,7,8"
  • ダッシュ(-)で値の範囲を指定する
    例)"1-6"("1,2,3,4,5,6"という指定と同じ意味になる)
  • アスタリスク(*)でそのフィールドで取りうる全ての値を表現する
    例)時をあらわすフィールドでは「毎時」という意味となる。

cron実装によっては,いくつかの追加拡張をおこなっているものもある。

  • スラッシュ(/)で一定値ごとの間隔を表現する 例)時フィールドで"*/3"指定は,"0,3,6,9,12,15,18,21"と同じ意味になる。
    つまり,"*"の場合は毎時をあらわすが,"/3"を指定すると,*で適用される値の範囲内における,1番目・4番目・7番目...といった意味になる。
Page Top

フィールド anchor.png

# (行頭の # マークはコメント行を示す)
# +------------ 分 (0 - 59)
# | +---------- 時 (0 - 23)
# | | +-------- 日 (1 - 31)
# | | | +------ 月 (1 - 12)
# | | | | +---- 曜日 (0 - 6) (日曜日=0)
# | | | | |
# * * * * * 実行されるコマンド

第6フィールド以降の行の残りの箇所に,実行すべきコマンドを指定する。

  • 注意すること
    • 「曜日」(第5フィールド)では,0,7の両方とも日曜日になる。
    • 「日」(第3フィールド)および「曜日」(第5フィールド)が同時に指定された場合,どちらかが満たされた場合,両方でコマンドが実行される。
    • コマンド指定において,「%」を使う場合は,エスケープ処理する必要がある。
      1 2 3 4 5 touch ~/error_`date "+%Y%m%d"`.txt
      これは,間違った指定である。
      1 2 3 4 5 touch ~/right_$(date +\%Y\%m\%d).txt
      のようにする。
    • 曜日と時間の指定ミス
      夏時間移行時に備えるために以下のように記述してみた。
      59 1 1-7 4 0 /root/shift_my_times.sh
      上記は,4月第一日曜日の午前1時59分にコマンドshift_my_times.shを実行するように見えるが,そのようには実行されない。
      4月1日から4月7日までの毎日,および,4月中の日曜日全てで,実行されてしまう。
      これを正しく実行されるようにするには,以下のようにする。
      59 1 1-7 4 * test `date +\%w` = 0 && /root/shift_my_times.sh
    • 2時間毎にジョブを実行しようとした場合
      * 0,2,4,6,8,10,12,14,16,18,20,22 * * * date >> /var/log/date.log
      と記述すると,各偶数時に毎分実行されてしまう。
      0 0,2,4,6,8,10,12,14,16,18,20,22 * * * date >> /var/log/date.log
      にすれば,意図したように動作する。
      0 */2 * * * date >> /var/log/date.log
      これでも,OK.
Page Top

/etc/crontabと/etc/cron.d/ anchor.png

/etc/crontabと,/etc/cron.d以下のものは,どちらもシステム全体用の設定ファイルである。

特徴は,前半の部分に実行時の環境変数を設定し,その後スケジュール設定,実行するコマンドというように記述する。
デフォルトは以下のようになっている。 /etc/crontab

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

環境変数設定部分と,コマンドのスケジュールの部分とに分かれている。

注意することとして,環境変数,特にPATHを設定していることがある。つまり,ここに記述していないPATHにあるコマンドは実行できないことを意味する。
ログイン後のPATHに,実行PATHをいくら設定しておいても/etc/crontabで実行されるジョブでは,実行PATHとしては使用されないということ。(ユーザの環境変数を参照しない。)

Page Top

設定内容 anchor.png

  • 環境変数
    • SHELL
      cronで使用されるシェルを設定する。
    • PATH
      cronに教える,パスの設定をする。
      ここで設定されていないパス上にあるコマンドを実行させる場合は,フルパスでコマンド等を設定する必要がある。~
    • MAILTO
      cronの実行結果を送るユーザまたはメールアドレスを指定する。
      メールを送信したくない場合は,MAILTO=””と設定する。
    • HOME
      cronが実行される,カレントディレクトリとなる。
    • その他の環境変数
      環境変数を設定したい場合は,任意で設定することが可能。(変数名も任意で設定できる)
      環境変数COMMANDに,logger cornd-testを設定して,それをスケジュールで読み込んで実行する例:
      #!/bin/sh
      SHELL=/bin/bash
      PATH=/sbin:/bin:/usr/sbin:/usr/bin
      MAILTO=root
      HOME=/
      
      COMMAND=logger cron.d-test
      
      */3 * * * * root $COMMAND
      */15 * * * * root $COMMAND
      18 * * * * root $COMMAND
      長いコマンドは,このように環境変数に設定することができるので,スケジュール設定はスッキリする。
Page Top

/etc/cron.dディレクトリ内の書き方 anchor.png

/etc/crontabと同じようにすればOK。 注意する点は,

  • パーミッションは644
  • 所有者はrootにする
Page Top

各ユーザー用のcron anchor.png

各ユーザー毎の設定は,ユーザーで路銀した後crontab -eコマンドで,設定ファイルを編集する。

ユーザー毎のcrontabは,/var/spool/cronにユーザー名で保存されている。

Page Top

うまく動かない場合 anchor.png

cronが動かない場合は,下記のことをチェックする。

  • ログを確認
  • メールの確認
  • ファイルのパーミッション・所有者の確認
  • パスの確認
  • 改行コードの確認
  • crondが動作しているか確認

新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ

トップ   凍結 差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 516, today: 1, yesterday: 0
最終更新: 2020-12-26 (土) 16:08:10 (JST) (1215d) by yuji