最終更新日: 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 を使うかどうか?) を決めれば良いはず。