CentOS7 で cron は何をインストールすればよいのか

最終更新日: 2018-01-21

CentOS7 に cron が入っていなかったという場合。(Docker など)

そこで cron を使うには、 yum install すればよいのだが、 Google 検索してみたところ、 CentOS の cron には少なくとも cronie と cronie-anacron と cronie-noanacron があり、 何をインストールすればよいのか、 何通りか説があるように思える。

いったいどれをどのようにインストールすればよいのか? (cron を設定する以前の所で悩むとは..)

● yum install ..

実際に cronie や cronie-anacron や cronie-noanacron あるいは crontabs (後述) を yum install してみると、 yum install が出すメッセージを見るに、 依存関係から、 以下のようにパッケージをインストールしようとすることが分かった。

1. yum install cronie → cronie に加え cronie-anacron と crontabs も入れようとする。
2. yum install cronie-anacron → cronie-anacron に加え cronie と crontabs も入れようとする。
3. yum install crontabs → crontabs に加え cronie と cronie-anacron も入れようとする。
4. yum install cronie-noanacron → cronie-noanacron に加え cronie と crontabs も入れようとする。

ということであれば、 少なくとも 1. と 2. と 3. は、 同じではないのか?

● 実際に yum install してみる

「rpm -ql パッケージ名」で、 そのパッケージでインストールされたパス名を表示させることが出来る。

そこで、 色々に yum install してみてから、 次に以下のスクリプト (rpmsum.sh) で、 インストールされたディレクトリ/ファイルと、 そのチェックサム (MD5) と、 それがどのパッケージのものか、 表示させてみる。 実験には docker コンテナを用いている (docker exec -i -t 〜 /bin/sh としてコンテナ内のシェルで実施)。

#!/bin/sh
# 2017-11-16 nsmrtks

# usage: sh rpmsum.sh package...

md5cmd='md5sum'

for arg
do
	rpm -ql "$arg" | while read line
	do
		if [ -d "$line" ]; then
			sum='directory                       '
		elif [ -f "$line" ]; then
			sum=`$md5cmd "$line" | awk '{ print $1 }'`
		elif [ -e "$line" ]; then
			sum='neither directory nor file      '
		else
			sum='nonexistent                     '
		fi
		printf '%-40s%s  %s\n' "$line" "$sum" "$arg"
	done
done | sort

# EoF

◎ cronie か cronie-anacron か crontabs をインストールする

以下のどれでも結果は同じになり、

以下のようであった。(rpm -ql では出てくるのに実際には入っていないディレクトリ/ファイル (以下で nonexistent となっているもの) もあるようだ)

# sh rpmsum.sh cronie cronie-anacron crontabs
/etc/anacrontab                         8241db83d5edf01c71734e41e383e205  cronie-anacron
/etc/cron.d                             directory                         cronie
/etc/cron.d/0hourly                     1638f7fe39f7f52c412e1705a0bc52d1  cronie
/etc/cron.daily                         directory                         crontabs
/etc/cron.deny                          d41d8cd98f00b204e9800998ecf8427e  cronie
/etc/cron.hourly                        directory                         crontabs
/etc/cron.hourly/0anacron               8675eb4a3dba8e20bd6b82c626304556  cronie-anacron
/etc/cron.monthly                       directory                         crontabs
/etc/cron.weekly                        directory                         crontabs
/etc/crontab                            c39252b11aad842fcb75e05c6a27eef8  crontabs
/etc/pam.d/crond                        73dbc2487cc4d9f5fab5e4cdea7aed7e  cronie
/etc/sysconfig/crond                    bf644ac15632af6a3788e5de7be13080  cronie
/etc/sysconfig/run-parts                d41d8cd98f00b204e9800998ecf8427e  crontabs
/usr/bin/crontab                        a3afcc621c9ca0e03aa64059374dc770  cronie
/usr/bin/run-parts                      caf460fcd592f1d872416e81e3ad3f52  crontabs
/usr/lib/systemd/system/crond.service   4a967cbca52fb8b9a0d567b9511bd87d  cronie
/usr/sbin/anacron                       2a59fa9c2fefb6437f7a86d09cefbcba  cronie-anacron
/usr/sbin/crond                         0cd62240b186403ba74c29b74eb40186  cronie
/usr/share/doc/cronie-1.4.11            nonexistent                       cronie
/usr/share/doc/cronie-1.4.11/AUTHORS    nonexistent                       cronie
/usr/share/doc/cronie-1.4.11/COPYING    nonexistent                       cronie
/usr/share/doc/cronie-1.4.11/ChangeLog  nonexistent                       cronie
/usr/share/doc/cronie-1.4.11/INSTALL    nonexistent                       cronie
/usr/share/doc/cronie-1.4.11/README     nonexistent                       cronie
/usr/share/man/man1/crontab.1.gz        nonexistent                       cronie
/usr/share/man/man4/crontabs.4.gz       nonexistent                       crontabs
/usr/share/man/man4/run-parts.4.gz      nonexistent                       crontabs
/usr/share/man/man5/anacrontab.5.gz     nonexistent                       cronie-anacron
/usr/share/man/man5/crontab.5.gz        nonexistent                       cronie
/usr/share/man/man8/anacron.8.gz        nonexistent                       cronie-anacron
/usr/share/man/man8/cron.8.gz           nonexistent                       cronie
/usr/share/man/man8/crond.8.gz          nonexistent                       cronie
/var/spool/anacron                      directory                         cronie-anacron
/var/spool/anacron/cron.daily           d41d8cd98f00b204e9800998ecf8427e  cronie-anacron
/var/spool/anacron/cron.monthly         d41d8cd98f00b204e9800998ecf8427e  cronie-anacron
/var/spool/anacron/cron.weekly          d41d8cd98f00b204e9800998ecf8427e  cronie-anacron
/var/spool/cron                         directory                         cronie

◎ cronie-anacron と cronie-noanacron を両方インストールしてみる

cronie と cronie-anacron と crontabs は、 どれを yum install しても同じになることが分かったので、 代表して cronie-anacron と、 そこからさらに cronie-noanacron をインストールしたらどうなるか試してみる。

以下のどちらの順番でも結果は同じになり、

以下のようであった。

# sh rpmsum.sh cronie cronie-anacron cronie-noanacron crontabs
/etc/anacrontab                         8241db83d5edf01c71734e41e383e205  cronie-anacron
/etc/cron.d                             directory                         cronie
/etc/cron.d/0hourly                     1638f7fe39f7f52c412e1705a0bc52d1  cronie
/etc/cron.d/dailyjobs                   ad4408666375b56f50277326c4b7a498  cronie-noanacron
/etc/cron.daily                         directory                         crontabs
/etc/cron.deny                          d41d8cd98f00b204e9800998ecf8427e  cronie
/etc/cron.hourly                        directory                         crontabs
/etc/cron.hourly/0anacron               8675eb4a3dba8e20bd6b82c626304556  cronie-anacron
/etc/cron.monthly                       directory                         crontabs
/etc/cron.weekly                        directory                         crontabs
/etc/crontab                            c39252b11aad842fcb75e05c6a27eef8  crontabs
/etc/pam.d/crond                        73dbc2487cc4d9f5fab5e4cdea7aed7e  cronie
/etc/sysconfig/crond                    bf644ac15632af6a3788e5de7be13080  cronie
/etc/sysconfig/run-parts                d41d8cd98f00b204e9800998ecf8427e  crontabs
/usr/bin/crontab                        a3afcc621c9ca0e03aa64059374dc770  cronie
/usr/bin/run-parts                      caf460fcd592f1d872416e81e3ad3f52  crontabs
/usr/lib/systemd/system/crond.service   4a967cbca52fb8b9a0d567b9511bd87d  cronie
/usr/sbin/anacron                       2a59fa9c2fefb6437f7a86d09cefbcba  cronie-anacron
/usr/sbin/crond                         0cd62240b186403ba74c29b74eb40186  cronie
/usr/share/doc/cronie-1.4.11            nonexistent                       cronie
/usr/share/doc/cronie-1.4.11/AUTHORS    nonexistent                       cronie
/usr/share/doc/cronie-1.4.11/COPYING    nonexistent                       cronie
/usr/share/doc/cronie-1.4.11/ChangeLog  nonexistent                       cronie
/usr/share/doc/cronie-1.4.11/INSTALL    nonexistent                       cronie
/usr/share/doc/cronie-1.4.11/README     nonexistent                       cronie
/usr/share/man/man1/crontab.1.gz        nonexistent                       cronie
/usr/share/man/man4/crontabs.4.gz       nonexistent                       crontabs
/usr/share/man/man4/run-parts.4.gz      nonexistent                       crontabs
/usr/share/man/man5/anacrontab.5.gz     nonexistent                       cronie-anacron
/usr/share/man/man5/crontab.5.gz        nonexistent                       cronie
/usr/share/man/man8/anacron.8.gz        nonexistent                       cronie-anacron
/usr/share/man/man8/cron.8.gz           nonexistent                       cronie
/usr/share/man/man8/crond.8.gz          nonexistent                       cronie
/var/spool/anacron                      directory                         cronie-anacron
/var/spool/anacron/cron.daily           d41d8cd98f00b204e9800998ecf8427e  cronie-anacron
/var/spool/anacron/cron.monthly         d41d8cd98f00b204e9800998ecf8427e  cronie-anacron
/var/spool/anacron/cron.weekly          d41d8cd98f00b204e9800998ecf8427e  cronie-anacron
/var/spool/cron                         directory                         cronie

これは、 先ほどの『cronie か cronie-anacron か crontabs をインストールする』から、 以下の 1行 (1ファイル) が増えているだけで、 他にディレクトリ/ファイルの追加/削除/変更は無い。

/etc/cron.d/dailyjobs                   ad4408666375b56f50277326c4b7a498  cronie-noanacron

cronie-noanacron が /etc/cron.d/dailyjobs の 1ファイルしか含んでいないことは、 CentOS6 の cron.daily 実行時刻を CentOS5 以前と同様に設定する でも言及されていた。

◎ cronie-noanacron をインストールする

以下のどれでも結果は同じになり、

以下のようであった。

# sh rpmsum.sh cronie cronie-noanacron crontabs
/etc/cron.d                             directory                         cronie
/etc/cron.d/0hourly                     1638f7fe39f7f52c412e1705a0bc52d1  cronie
/etc/cron.d/dailyjobs                   ad4408666375b56f50277326c4b7a498  cronie-noanacron
/etc/cron.daily                         directory                         crontabs
/etc/cron.deny                          d41d8cd98f00b204e9800998ecf8427e  cronie
/etc/cron.hourly                        directory                         crontabs
/etc/cron.monthly                       directory                         crontabs
/etc/cron.weekly                        directory                         crontabs
/etc/crontab                            c39252b11aad842fcb75e05c6a27eef8  crontabs
/etc/pam.d/crond                        73dbc2487cc4d9f5fab5e4cdea7aed7e  cronie
/etc/sysconfig/crond                    bf644ac15632af6a3788e5de7be13080  cronie
/etc/sysconfig/run-parts                d41d8cd98f00b204e9800998ecf8427e  crontabs
/usr/bin/crontab                        a3afcc621c9ca0e03aa64059374dc770  cronie
/usr/bin/run-parts                      caf460fcd592f1d872416e81e3ad3f52  crontabs
/usr/lib/systemd/system/crond.service   4a967cbca52fb8b9a0d567b9511bd87d  cronie
/usr/sbin/crond                         0cd62240b186403ba74c29b74eb40186  cronie
/usr/share/doc/cronie-1.4.11            nonexistent                       cronie
/usr/share/doc/cronie-1.4.11/AUTHORS    nonexistent                       cronie
/usr/share/doc/cronie-1.4.11/COPYING    nonexistent                       cronie
/usr/share/doc/cronie-1.4.11/ChangeLog  nonexistent                       cronie
/usr/share/doc/cronie-1.4.11/INSTALL    nonexistent                       cronie
/usr/share/doc/cronie-1.4.11/README     nonexistent                       cronie
/usr/share/man/man1/crontab.1.gz        nonexistent                       cronie
/usr/share/man/man4/crontabs.4.gz       nonexistent                       crontabs
/usr/share/man/man4/run-parts.4.gz      nonexistent                       crontabs
/usr/share/man/man5/crontab.5.gz        nonexistent                       cronie
/usr/share/man/man8/cron.8.gz           nonexistent                       cronie
/usr/share/man/man8/crond.8.gz          nonexistent                       cronie
/var/spool/cron                         directory                         cronie

これは、 先ほどの『cronie-anacron と cronie-noanacron を両方インストールしてみる』から、 cronie-anacron 特有のディレクトリ/ファイル (rpmsum.sh の出力の右端が「cronie-anacron」になっている行) を取り去ったものに等しく、 他にディレクトリ/ファイルの追加/削除/変更は無い。

つまり、 「cronie-anacron でなく cronie-noanacron を使いたい!」という場合、 わざわざ「cronie-noanacron をインストールしてから cronie-anacron をアンインストールする」の順番を守らなくても、 あるいは (cronie-anacron が無い状態から) cronie-noanacron を単独でインストールしても同じである。

あれだけ多くのページで、 「必ず cronie-noanacron をインストールしてから cronie-anacron をアンインストールする」としているのは、 いったい何なのか.. 自分が知らない理由があるのか、 全く不明である。
yum remove cronie-anacron すると cronie や crontabs もアンインストールしようとするので、 それらに依存するパッケージがあった場合の考慮かな?

● 結局どうするのが良いか

ところで、 もし「cronie-anacron でなく cronie-noanacron を使いたい」という場合、 本当に cronie-anacron をアンインストールしないといけないのだろうか。
たしかに、 cronie-noanacron 唯一のファイルである /etc/cron.d/dailyjobs では、 以下のようになっている。

# Run the daily, weekly, and monthly jobs if cronie-anacron is not installed
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# run-parts
02 4 * * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.daily
22 4 * * 0 root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.weekly
42 4 1 * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.monthly


ファイル /etc/cron.hourly/0anacron (= cronie-anacron に含まれるファイル) が存在していると、 /etc/cron.d/dailyjobs は機能しない。 つまり、 cronie-noanacron と cronie-anacron を両方インストールしていると、 そのままでは cronie-noanacron は機能しない。

だがそれは、 /etc/cron.daily と /etc/cron.weekly と /etc/cron.monthly が cronie-noanacron でなく cronie-anacron に制御されるというだけで (cronie-anacron の場合は /etc/anacrontab で似たようなことをしている)、 例えば、 /etc/crontab に記述したものは、 anacron でなく通常の cron の動作になるのではないか。

Scientific Linux 6で自宅サーバー構築 番外編その1 Scientific Linux 6のcronについて に、 以下のような記述がある。

明限突破ブログの管理人さんの見解ではRHEL6系は
  1. cron.{daily|weekly|monthly} 以下に置いたファイルは、 実行時間が指定されていないため、いつ実行されるかわからない。
  2. 明示的に実行タイミングを指定したい場合は、
    /etc/cron.d
    /etc/crontab
    /var/spool/cron (crontab -e)
    にて指定すること。
  3. デフォルト登録されているログローテーション等の処理時間を固定化したい場合、 crontabに実行時間を書くと、 今までどおりの動作になる。
ということでした。

この見解が正しいように思う。

よって、 以下のような理解で方針 (anacron を使うかどうか?) を決めれば良いはず。

  1. /etc/cron.daily と /etc/cron.weekly と /etc/cron.monthly に置かれた cron の設定は、
  2. /etc/crontab と /erc/cron.d と crontab -e は、 常に cron で制御される
  3. もし 1. を用いず 2. だけで設定するというのなら、 cronie-anacron と cronie-noanacron のどちらがインストールされていようが関係ない。 (その場合 anacron でなく cron で制御される)

以上


index