|
現: 2020-12-26 (土) 16:08:10 yuji |
| + | * cron [#p49386ba] |
| + | ''cron''は,Unix系OS(Linuxのような)で使用される,ジョブ(スクリプト)を自動実行するためのデーモンプロセスのこと。~ |
| + | Linuxや各種のサーバーで管理を行なう場合,ログのローテートや,バックアップ,定期的に自動実行したいジョブが数多くある。特に,バックアップなどはシステムへの負荷が大きいため,通常は,ユーザからのアクセスが少ない深夜や早朝に行なうようにすることが多い。 |
| | | |
| + | このように,定期的に実行されるジョブは''crond''というデーモンによって,自動的に行なうように管理することが出来る。 |
| + | |
| + | ** crontab [#n456120b] |
| + | crontab(クロンタブ)は,cronで管理される定時実行のスケジュール管理を行うために用いられるコマンドや定義ファイルのこと。~ |
| + | |
| + | crontabには,各ユーザ毎の個人用の物と,システム全体用のものがある。もちろん,システム全体用の物は,システム管理者のみが編集可能になっている。 |
| + | |
| + | crontabファイルの各行は,空白またはタブで区切られたフィールド列から構成される特有の形式となっている。 |
| + | |
| + | *** 特殊記号 [#m5932bff] |
| + | フィールド中で複数の値を指定するには,いくつかの方法がある。 |
| + | - コンマ(,)で値のリストを指定する~ |
| + | 例)"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番目...といった意味になる。 |
| + | |
| + | *** フィールド [#m408d218] |
| + | # (行頭の # マークはコメント行を示す) |
| + | # +------------ 分 (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. |
| + | |
| + | ** /etc/crontabと/etc/cron.d/ [#o01b773d] |
| + | ''/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としては使用されないということ。(ユーザの環境変数を参照しない。) |
| + | |
| + | *** 設定内容 [#gf54eaac] |
| + | - 環境変数~ |
| + | -- 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 |
| + | 長いコマンドは,このように環境変数に設定することができるので,スケジュール設定はスッキリする。~ |
| + | |
| + | *** /etc/cron.dディレクトリ内の書き方 [#h9306431] |
| + | ''/etc/crontab''と同じようにすればOK。 |
| + | 注意する点は, |
| + | - パーミッションは644~ |
| + | - 所有者はrootにする |
| + | |
| + | ** 各ユーザー用のcron [#na66c130] |
| + | 各ユーザー毎の設定は,ユーザーで路銀した後''crontab -e''コマンドで,設定ファイルを編集する。 |
| + | |
| + | ユーザー毎のcrontabは,''/var/spool/cron''にユーザー名で保存されている。 |
| + | |
| + | |
| + | |
| + | ** うまく動かない場合 [#y7216e6e] |
| + | cronが動かない場合は,下記のことをチェックする。 |
| + | - ログを確認~ |
| + | - メールの確認~ |
| + | - ファイルのパーミッション・所有者の確認~ |
| + | - パスの確認~ |
| + | - 改行コードの確認~ |
| + | - crondが動作しているか確認~ |