cronを動かす。
crontab -e
○ crontab -e はどこを編集しているのか。
中々調べたいことまでたどり着かない。
○ anacrontabについて
○ anacrontabについて
REHLで、anacronが使用されているらしい。
REHL6では区別は以下になる。
- 日次、週次、月次のジョブはanacronで実行する
- その他のジョブはcronで実行する
○ crontab -e はどこを編集しているのか。
ファイル名/ディレクリ名 | 利用者 | 主な用途 |
/var/spool/cron/user | 全ユーザ | ユーザの自動タスク設定ファイル |
/etc/crontab | root |
毎時、毎日、毎月、毎週の自動タスクのメイン設定ファイル |
/etc/cron.hourly | root | 毎時自動タスク設定ファイルを置くディレクトリ |
/etc/cron.daily | aaaaaaa | aaaaaaa |
/etc/cron.monthly | aaaaaaa | aaaaaaa |
/etc/cron.weekly | aaaaaaa | aaaaaaa |
/etc/cron.d | root | 上記以外の自動タスク設定ファイルを置く場所 |
cron を使用するためには、crond が起動する。通常は、インストール時にサービスが自動起動するように設定されているが、以下のコマンドで、crond の状態を確認できる。
# /etc/rc.d/init.d/crond status crond (pid xxx) を実行中...もし、crond が起動していなかった場合には、crond を手動で起動し、以後、OS起動時にcrond が自動起動するように設定する。
# /etc/rc.d/init.d/crond start crondを起動中: # chkconfig --level 2345 crond on ・・・(注1) # chkconfig --list crond ・・・(注2) crond 0:オフ 1:オフ 2:オン 3:オン 4:オン 5:オン 6:オフ
注1 | runlevel 2,3,4,5 で cron を起動 |
注2 | 設定の確認 |
■crontabコマンドの書式 crontabファイルは、cron を操作する際に作成し、プロセスを定期的に実行するためのファイルで、crontabコマンドで作成します。書式は、以下の通り。 # crontab [- u user] {-l|-r|-e}なお、指定可能なオプションについては、下の表を参照。
■crontabコマンドの使用例 以下に、crontabコマンドの使用例を記載。 rootユーザが、testユーザの crontabファイルを表示する場合。 # crontab -l -u test自分自身の crontabファイルを編集する場合。 $ crontab -e |
■cron コマンドの設定
crontabファイルで、cron コマンドの実行を記述する行は、6つのフィールドで形成されており(システムの crontabファイル(/etc/crontab)は、7つ(分、時、日、月、曜日、ユーザ名、コマンド))、コマンドの実行時間をさまざまな形式で指定することが出来る。具体的には、以下の通りで、設定可能な値については、(表1)を参照。
なお、初めてcrontabファイルを編集した場合には、何も書かれていないので、以下のフォーマットで記述する。また、各フィールドでは、 '*' を使用することが可能である。
分 時 日 月 曜日 コマンド
表1 | |
---|---|
分 | 0~59 |
時 | 0~23 |
日 | 1~31 |
月 | 1~12 or jan~dec |
曜日 | 0~7 [0,7は日曜日] or sun~sat |
コマンド | 有効なコマンドを記述します。空白を含むことも可能ですが、標準のBourne Shellの書式に従って記述します。 |
また、crontabファイルでは、リストと範囲の指定を行なうことができます。リストとは、一つのフィールドに対して、複数の値を設定することで、範囲とは、一つのフィールドに対して、特定の範囲の値を設定することです。そして、リストと範囲は、一つのフィールドに共存することもできます。さらに、間隔値(指定間隔に一度、処理を実行)を設定することもできます。
表2 | ||
---|---|---|
設定例 | コメント | |
リスト | 0,15,30,45 | 分フィールドで指定した場合、15分に一度処理を実行します。 |
範囲 | 1-5 | 曜日フィールドで指定した場合、月曜日~金曜日に処理を実行します。 |
共存 | 1,3,7-9 | 時間フィールドで指定した場合、1時、3時、7時、8時、9時に処理を実行します。 |
間隔値 | 1-5/2 | 時間フィールドで指定した場合、1時、3時、5時に処理を実行します。なお、間隔値は、「/」の後ろに指定した値の間隔で処理を実行します。 |
5.設定ファイル(/etc/crontab) |
■「/etc/crontab」 通常、このファイルには、以下のように、「cron.monthly」、「cron.weekly」、「cron.daily」、「cron.hourly」配下のファイルが、指定時間ごとに実行されるように設定されている。 SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly 0-59/5 * * * * root /usr/bin/mrtg /etc/mrtg/mrtg.cfgこのファイルも、「/var/spool/cron/user」ファイルと同様に、コメント行、環境変数の設定、cronコマンドの実行の3つで形成されますが、cronコマンドの実行を設定する行の書式が若干異なっています。 具体的には、「3.crontabファイル」の 「■cron コマンドの設定」 のところでも簡単にふれましたが、このファイルを直接編集する場合には、ユーザフィールドが追加され、以下のように、7つのフィールドで形成されます。 分 時 日 月 曜日 ユーザ コマンドただし、RedHat系の Linuxでは、このファイルを直接編集することは推奨されていないため、定期的に実行したいコマンドについては「cron.monthly」、「cron.weekly」、「cron.daily」、「cron.hourly」配下のファイル、または、crontabコマンドを用いて、「/var/spool/cron/user」ファイルに設定を行ないます。 →つまり「cron.monthly」、「cron.weekly」、「cron.daily」、「cron.hourly」は直接編集する。 ■「/etc/cron.monthly、cron.weekly、cron.daily、cron.hourly」 上述の通り、これらのディレクトリは、「/etc/crontab」ファイルによって呼び出され、指定時間ごとに、配下にあるシェルスクリプトを実行します。 例えば、「/etc/cron.daily/logrotate」ファイルには、以下のように設定されています。 #!/bin/sh /usr/sbin/logrotate /etc/logrotate.confこれらのディレクトリに、作成したシェルスクリプトを保存し、実行権を付与します。ここで、実行権を与えないと、作成したシェルスクリプトが実行されませんので、特に注意が必要です。 # chmod 755 /etc/cron.daily/logrotateなお、これらのディレクトリに保存したシェルスクリプトは、時間をカスタマイズして実行することができませんので、任意の時間にジョブを実行したい場合には、crontabコマンドを使用して、「/var/spool/cron/user」ファイルに設定します。 |
6.アクセス制御 |
略
今までの説明を見ても、実際に登録して、どこに反映され、処理結果をみることができるのかという説明がない!!
下記参考
設定にあるそれぞれのフィールドについて
それぞれのフィールドは左から順番に以下のような意味になっています。
各フィールドと入力する値
フィールド | 指定する値 |
---|---|
分 | 0~59 |
時 | 0~23 |
日 | 1~31 |
月 | 1~12 もしくは jan~dec |
曜日 | 0~7 (0と7は日曜日) もしくは sun~sat |
コマンド | 有効なコマンド(ディレクトリまたはシュルスクリプトファイル)を記述します。 |
「*(アスタリスク)」はどんな意味かというと、それぞれのフィールドが1増加するごとに実行するという指定になります。
少し分かりにくいので実例で解説します。
設定ファイルの一番上の例では分フィールドに01が指定され、後は*です。
*の意味を省略せずに書くと「毎月・毎曜日・毎日・毎時、分数が1の時に実行」という意味になります。
01 * * * * |
例えば月曜日だけ毎時実行したいという場合は週フィールドに1を指定します。
01 * * * 1 |
ルールの確認
# crontab -l
ルールがない場合は以下のように表示される。
no crontab for hoge |
ルールの削除
こちらのコマンドは確認もせずに全てのルールを削除するので、使用はお薦めできません。「crontab -e」で開いて、必要のなくなったルールだけ削除すると事故が減ります。
# crontab -r
rootにhogeのメッセージを飛ばす
[root@localhost log]# crontab -e
crontab: installing new crontab
MAILTO=root
0-59 * * * * echo "hoge"
上記の設定だと、rootユーザー宛に、Cron Demonから「hoge」と書かれたメールが毎分届く。
→調査中
→
(調査結果)
おそらく、/var/spool/mailに保存されている。
どうして、具体的に書かずどこに届いているのかわからない記載で止めるのか。
メールを送信するスクリプトを限定する
新規ルールを追加
# crontab -e
以下を追加します。
MAILTO="" 0-59 * * * * echo "hoge" 0-59 * * * * echo "huga" 2>&1 | Mail hoge@example.com |
「MAILTO=””」となっているのでメールは送信さませんが、「|(パイプ)」でつないで「Mail hoge@example.com」と渡しているので「huga」というスクリプトの実行結果だけ送信されてきます。
tちなみに「2>&1」はお決まりの、標準出力と標準エラーを合わせて出力するという指定です。この形式の場合、メールの差出人はcronではなく、実行したユーザーとドメイン名「hoge@example.com」で送信されてきます。
→上記はうまくいかなかった。vagrant環境だからか。vps環境ならうまくいく?
(調査結果)
ユーザー個別の設定ファイルは「/var/spool/cron/」にユーザー名ごとに作成される。
つまり、crontab -eは「/var/spool/cron/」にユーザー名ごとに作成される。
・出力をログに吐き出す
rootユーザでログはファイルを作る。
[vagrant@localhost log]$ sudo touch www_cronlog
# crontab -e (以下を追加) MAILTO="" 0-59 * * * * echo "hoge" 2>&1 >>/var/log/www_cronlog
これでメールを飛ばさない代わりに、ログファイル「/var/log/www_cronlog」に結果が出力される。
追記を行うためのリダイレクション記号は「>」が2つ。
1つだと書き出すごとに上書きされてしまう。
結果通りになった。
(総括)
crontab -eがどこを編集し、どういう風に結果を確認するのかを追えた。
今回調査したかった最低限のことはできた。
rc.localはどうなのかという疑問が残るが、別に調査したい。