システムのcron設定
ユーザーのcronに対し、システム用のcrontabも用意されています。/etc/crontabファイルはというファイルに対し、そこから/etc/cron.*ディレクトリ配下に置かれたファイルを呼び出します。
システムのcrontabの書式について
ユーザーのcrontabについてはユーザー名が明らかでしたが、システムのcrontabにはユーザー名が明記されています。
書式
分 時 日 月 曜日 ユーザー名 コマンド
crontab関連のファイル、ディレクトリ について
ファイル/ディレクトリ | 説明 |
/etc/crontab | システムのcrontabファル。 |
/etc/cron.hourly/ | 1時間に1度実行したいcronジョブを記載したファイルを格納するディレクトリ。 |
/etc/cron.daily/ | 1日に1度実行したいcronジョブを記載したファイルを格納するディレクトリ。 |
/etc/cron.weely/ | 1週間に1度実行したいcronジョブを記載したファイルを格納するディレクトリ。 |
/etc/cron.monthly/ | 1ヶ月に1度実行したいcronジョブを記載したファイルを格納するディレクトリ。 |
/etc/cron.d/ | cronジョブを記載したファイルを格納するディレクトリ。 |
検証
※以下の検証はCentOS8で検証しています。
検証するのに1日とか1週間はかけられないので、1時間あたりで実行する/etc/cron.houlyの検証をします。
まずは、/etc/cron.hourlyから。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[root@localhost cron.hourly]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # 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 ###毎時47分に/cron/hourly配下にあるスクリプトを実行。 47 * * * * root run-parts /etc/cron.hourly |
run-partsについて
run-partsは、指定したディレクトリ配下にあるファイルを全て実行してくれるコマンドです。
run-partsの実行例
1 2 3 4 5 |
[root@localhost localhost]# ls -l /home/localhost/ -rwxr-xr-x. 1 root root 31 9月 7 13:18 EchoFile01.sh -rwxr-xr-x. 1 root root 31 9月 7 13:18 EchoFile02.sh -rwxr-xr-x. 1 root root 31 9月 7 13:19 EchoFile03.sh |
実行するファイルの中身を見ます。
1 2 3 4 5 6 7 |
[root@localhost localhost]# cat /home/localhost/EchoFile01.sh echo "This file is EchoTest01" [root@localhost localhost]# cat /home/localhost/EchoFile02.sh echo "This file is EchoTest02" [root@localhost localhost]# cat /home/localhost/EchoFile03.sh echo "This file is EchoTest03" |
実行されると、ファイル名を表示するスクリプトです。では、run-partsで実行します。
1 2 3 4 5 6 7 8 |
[root@localhost localhost]# run-parts /home/localhost/ /home/localhost/EchoFile01.sh: This file is EchoTest01 /home/localhost/EchoFile02.sh: This file is EchoTest02 /home/localhost/EchoFile03.sh: This file is EchoTest03 |
次に、/etc/cron.hourly/に適当なシェルを追加する。今回はtest.shというファイルを入れておきました。
1 2 3 4 |
[root@localhost cron.hourly]# cat /etc/cron.hourly/test.sh echo `date` >> /home/localhost/test.log echo "crond.hourly TEST" >> /home/localhost/test.log |
あとはcronの指定した時間を待つだけ!と思って検証してもなかなかうまくいかなかったので、追記しておきます。結論は下記。
1 2 3 4 |
[root@localhost localhost]# ls -l /etc/cron.hourly/ -rwxr-xr-x. 1 root root 575 5月 11 2019 0anacron -rwxr-xr-x. 1 root root 93 9月 7 13:30 test.sh |
test.shに実行権がないと、実行できません。ファイルを配置した後、権限があるかはチェックする必要があります。
検証結果
1 2 3 4 |
[root@localhost cron.hourly]# tail -f /home/localhost/test.log 2020年 9月 7日 月曜日 13:47:01 JST crond.hourly TEST |
時間通り出力されました。
なお、/etc/cron.hourlyで設定したものは、/etc/cron.d/配下にあるファイルに記述されていました。
1 2 3 4 5 6 7 8 9 10 |
[root@localhost ~]# ls -l /etc/cron.d/ -rw-r--r--. 1 root root 128 5月 11 2019 0hourly -rw-r--r--. 1 root root 108 5月 11 2019 raid-check [root@localhost ~]# cat /etc/cron.d/0hourly # Run the hourly jobs SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root 01 * * * * root run-parts /etc/cron.hourly |
/etc/cron.dを使用した設定例
上記の設定は、サイクルを/etc/crontabで指定しています。上記のようなサイクルとは別にジョブを指定したい場合に、cron.dディレクトリ配下を使用します。cron.d配下にはスクリプトファイルではなく、cronジョブを記述したファイルを格納します。
検証
/etc/cron.d/の配下に、次のようなファイルを作りました。
1 2 3 4 5 6 7 8 9 10 |
[root@localhost ~]# ls -l /etc/cron.d/ -rw-r--r--. 1 root root 128 5月 11 2019 0hourly -rw-r--r--. 1 root root 108 5月 11 2019 raid-check -rw-------. 1 root root 159 9月 7 14:27 testcron01.sh [root@localhost ~]# cat /etc/cron.d/testcron01.sh #####Test/etc/cron.d/testcron.sh##### ####1分ごとに記録##### */1 * * * * root echo `date` >> /home/localhost/test.log */1 * * * * root free >> /home/localhost/test.log |
さて、これで1分待ちます。しかし、うまく実行できません。
/var/log/cronを見に行く。
cronに関するログは/var/log/cronにあります。
1 2 3 4 5 |
[root@localhost cron.d]# tail -f /var/log/cron (途中省略) Sep 7 14:18:01 localhost crond[8853]: (root) BAD FILE MODE (/etc/cron.d/testcron01.sh) Sep 7 14:20:01 localhost crond[8853]: (root) BAD FILE MODE (/etc/cron.d/testcron01.sh) |
何やら怒られています。
解決策
調べてみると、パーミッションを変える必要があるようです。以下のように「600」に変えます。
1 2 3 4 |
[root@localhost ~]# chmod 600 testcron01.sh [root@localhost ~]# ls -l /etc/cron.d/testcron01.sh -rw-------. 1 root root 159 9月 7 14:27 /etc/cron.d/testcron01.sh |
再びログを観察。
1 2 3 4 5 6 7 |
[root@localhost ~]# tail -f /var/log/cron (途中省略) Sep 7 14:18:01 localhost crond[8853]: (root) BAD FILE MODE (/etc/cron.d/testcron01.sh) Sep 7 14:20:01 localhost crond[8853]: (root) BAD FILE MODE (/etc/cron.d/testcron01.sh) Sep 7 14:24:01 localhost CROND[9986]: (root) CMD (echo `date` >> /home/localhost/test.log) Sep 7 14:24:01 localhost CROND[9987]: (root) CMD (free >> /home/localhost/test.log) |
OKっぽいログが出ました。/home/localhost/test.logを観にいきます。
無事に出力されているけど…なんか実行される順番が変です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[root@localhost cron.d]# tail -f /home/localhost/test.log 2020年 9月 7日 月曜日 14:24:01 JST total used free shared buff/cache available Mem: 1873316 1045780 114468 10220 713068 642828 Swap: 2170876 6924 2163952 total used free shared buff/cache available Mem: 1873316 1046552 113664 10224 713100 642048 Swap: 2170876 6924 2163952 2020年 9月 7日 月曜日 14:25:01 JST total used free shared buff/cache available Mem: 1873316 1046788 113408 10228 713120 641800 Swap: 2170876 6924 2163952 2020年 9月 7日 月曜日 14:26:01 JST |
ログも見ます。
1 2 3 4 5 6 7 8 9 10 11 12 |
[root@localhost cron.d]# tail -f /var/log/cron Sep 7 14:13:01 localhost crond[8853]: (root) BAD FILE MODE (/etc/cron.d/testcron01.sh) Sep 7 14:17:01 localhost crond[8853]: (root) BAD FILE MODE (/etc/cron.d/testcron01.sh) Sep 7 14:18:01 localhost crond[8853]: (root) BAD FILE MODE (/etc/cron.d/testcron01.sh) Sep 7 14:20:01 localhost crond[8853]: (root) BAD FILE MODE (/etc/cron.d/testcron01.sh) Sep 7 14:24:01 localhost CROND[9986]: (root) CMD (echo `date` >> /home/localhost/test.log) Sep 7 14:24:01 localhost CROND[9987]: (root) CMD (free >> /home/localhost/test.log) Sep 7 14:25:01 localhost CROND[10032]: (root) CMD (free >> /home/localhost/test.log) Sep 7 14:25:01 localhost CROND[10033]: (root) CMD (echo `date` >> /home/localhost/test.log) Sep 7 14:26:01 localhost CROND[10071]: (root) CMD (echo `date` >> /home/localhost/test.log) Sep 7 14:26:01 localhost CROND[10072]: (root) CMD (free >> /home/localhost/test.log) |
一応cronは実行されましたが、これではなんだか気持ち悪い。上から順番に実行してくれるわけではない?
解決策
以下のように書き直しました。実行する順番を
1 2 3 4 5 |
[root@localhost ~]# cat /etc/cron.d/testcron01.sh #####Test/etc/cron.d/testcron.sh##### ####1分ごとに記録##### */1 * * * * root echo `date` >> /home/localhost/test.log ; free >> /home/localhost/test.log |
ログ、記録されたファイルは以下。
1 2 3 4 5 6 |
[root@localhost ~]# cat /var/log/cron |tail -4 Sep 7 14:43:01 localhost CROND[10479]: (root) CMD (echo `date` >> /home/localhost/test.log ; free >> /home/localhost/test.log) Sep 7 14:44:01 localhost CROND[10526]: (root) CMD (echo `date` >> /home/localhost/test.log ; free >> /home/localhost/test.log) Sep 7 14:45:01 localhost CROND[10573]: (root) CMD (echo `date` >> /home/localhost/test.log ; free >> /home/localhost/test.log) Sep 7 14:46:01 localhost CROND[10611]: (root) CMD (echo `date` >> /home/localhost/test.log ; free >> /home/localhost/test.log) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[root@localhost ~]# cat /home/localhost/test.log 2020年 9月 7日 月曜日 14:43:01 JST total used free shared buff/cache available Mem: 1873316 1045504 114784 10264 713028 643116 Swap: 2170876 6924 2163952 2020年 9月 7日 月曜日 14:44:01 JST total used free shared buff/cache available Mem: 1873316 1045536 114724 10268 713056 643072 Swap: 2170876 6924 2163952 2020年 9月 7日 月曜日 14:45:01 JST total used free shared buff/cache available Mem: 1873316 1045568 114700 10272 713048 643040 Swap: 2170876 6924 2163952 2020年 9月 7日 月曜日 14:46:01 JST total used free shared buff/cache available Mem: 1873316 1045620 114640 10276 713056 642984 Swap: 2170876 6924 2163952 |
無事に「日付」の下に「freeコマンドの結果」が出力されるようになりました。