最終更新日: 2018-01-21
CentOS7 に cron が入っていなかったという場合。(Docker など)
そこで cron を使うには、 yum install すればよいのだが、 Google 検索してみたところ、 CentOS の cron には少なくとも cronie と cronie-anacron と cronie-noanacron があり、 何をインストールすればよいのか、 何通りか説があるように思える。
でもこれを見るとanacron削除しなくていいんじゃないかという気がしてきました。
本当に削除が必要なのかは、ちょっと自信がないです。
CentOS7を利用してる方たちは削除して入れ替えているようです。競合するのでしょうか。
競合する気があまりしないんですけどね。いずれ調べよう。
いったいどれをどのようにインストールすればよいのか? (cron を設定する以前の所で悩むとは..)
実際に 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. は、 同じではないのか?
「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
以下のどれでも結果は同じになり、
以下のようであった。(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 と 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 以前と同様に設定する でも言及されていた。
以下のどれでも結果は同じになり、
以下のようであった。
# 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系はということでした。
- cron.{daily|weekly|monthly} 以下に置いたファイルは、 実行時間が指定されていないため、いつ実行されるかわからない。
 - 明示的に実行タイミングを指定したい場合は、
 
/etc/cron.d
/etc/crontab
/var/spool/cron (crontab -e)
にて指定すること。- デフォルト登録されているログローテーション等の処理時間を固定化したい場合、 crontabに実行時間を書くと、 今までどおりの動作になる。
 
この見解が正しいように思う。
よって、 以下のような理解で方針 (anacron を使うかどうか?) を決めれば良いはず。