cronを動かして結果をみる。

cronを動かす。

crontab -e
○ crontab -e はどこを編集しているのか。

中々調べたいことまでたどり着かない。

○ anacrontabについて

 

○ anacrontabについて

enakai00.hatenablog.com

 

REHLで、anacronが使用されているらしい。

REHL6では区別は以下になる。

  • 日次、週次、月次のジョブはanacronで実行する
  • その他のジョブはcronで実行する

 

 ○ crontab -e はどこを編集しているのか。

 下記参考2

cron の設定ガイド

 ファイル名/ディレクリ名 利用者 主な用途
 /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コマンドの書式 

crontabファイルは、cron を操作する際に作成し、プロセスを定期的に実行するためのファイルで、crontabコマンドで作成します。書式は、以下の通り。 

# crontab [- u user] {-l|-r|-e}
なお、指定可能なオプションについては、下の表を参照。 

オプション
-e crontabを対話的に編集します。通常は、viエディタが起動して、設定ファイルの編集を行ないます。
-l crontabファイルの内容を表示します。
-r crontabファイルを削除します。
-u user userで指定したユーザのcrontabファイルを操作の対象とします。なお、このオプションは、rootユーザのみ使用できます。
   


■crontabコマンドの使用例 

以下に、crontabコマンドの使用例を記載。 

rootユーザが、testユーザの crontabファイルを表示する場合。 
# crontab -l -u test
自分自身の crontabファイルを編集する場合。 
$ crontab -e
(調査結果)  
crontabでの編集は、/etc/crontabとかを編集するものではなく、各ユーザー毎の /var/cron/spool/user 箇所の編集だと思われる。
なぜ、そこらへんを明確に記載しないのか大変疑問である、わかりにくい。 

 

■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.アクセス制御

 略

 

 

今までの説明を見ても、実際に登録して、どこに反映され、処理結果をみることができるのかという説明がない!!

 

下記参考 

https://oxynotes.com/?p=6912

設定にあるそれぞれのフィールドについて

それぞれのフィールドは左から順番に以下のような意味になっています。

cron01

各フィールドと入力する値

フィールド 指定する値
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

crontab -e で編集
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/」にユーザー名ごとに作成される。

逆に言うと、/var/spool/cron/ の中は、ユーザ毎にcrontab -eで編集したことになる。

 

・出力をログに吐き出す

 

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はどうなのかという疑問が残るが、別に調査したい。