スタッフブログ
こんばんわ。なおとです。
つい最近の仕事のことですが、CRONを使った自動実行について手間取ってしまったので、復習をしておきます。 以下はあくまで一例で、OSの違いなどでバリエーションがありえます。
CRONTAB
- ユーザ毎のCRONTAB
- /var/spool/cron/∗ など
- システムのCRONTAB
- /etc/crontab [600 or 644] root
- /etc/cron.d/∗ [600 or 644] root
あるCRONのジョブを実行するタイミングと、その内容を登録するところです。/etc/crontabはできるだけ編集しないのが作法です。
典型的なタイミング(毎日深夜、など)で実行する処理は、ここで登録しなくても用意されているディレクトリにスクリプトを置いておけば、実行されます。
システムのCRON用スクリプト
実際にはCRONTABの中では複雑なことは書きづらいので、シェルスクリプトなどを登録しておきます。目的の処理をする実体は、そのスクリプトの中に記述します。
- /etc/cron.daily/∗ [755] root
- /etc/cron.hourly/∗ [755] root
- /etc/cron.monthly/∗ [755] root
- /etc/cron.weekly/∗ [755] root
- ほか [755] ∗ など
CRONTABをユーザーに持たせるとどこにいったのか分かりにくくなることがあるので、できれば避けます。今回もその辺を整理してすっきりしました。
CRONとapacheで共通の処理対象があるとき
CRONのジョブからなにかファイルを生成するとき、apache httpdからも同じディレクトリ/ファイルを操作することがある場合には、ファイルやディレクトリの所有者、実行権限に気をつけます。具体的には次のような仕込みをします。
共用するユーザは、ある共通のグループ(たとえば、apacheグループ)に参加させておきます。 生成されるファイルを置くディレクトリには、セットグループIDをつけておきます。
CRONのジョブは、rootではなくapacheユーザで実行します。 システムのCRONTABでは、実行時のユーザを指定するようになっているので、/etc/cron.d/を使います。
そこに登録しておいたスクリプトの実行時ユーザはapacheになり、生成されるファイルの所有者とグループもapacheになります。 以上です。
ここにFTPやファイル共有なども絡むともう少し考えることが多くなるかもしれませんが、だいたいこれでOKです。 こういうことは忘れやすいので、ときどきは実際に手を動かしておかないと身につかないものですね。