色々なcronの場所と違い【Ubuntu 18.04.4 LTS】

cronは

crontab -e

というコマンドを実行すれば、cronを自由に設定できると思っていたのですが

 

どうやらcronには

  • /var/spool/cron/crontabs/[USER]
  • /etc/crontab
  • /etc/cron.hourly
  • /etc/cron.daily
  • /etc/cron.monthly
  • /etc/cron.weekly
  • /etc/cron.d

という感じでいろいろな

  • cron設定ファイル(青字
  • 定期実行させたいシェルスクリプトを置くためのディレクトリ(赤字
  • cron設定ファイルを置くためのディレクトリ(緑字

が存在するらしい。

それについて色々メモ。

書いた人の環境:Ubuntu 18.04.4 LTS

/var/spool/cron/crontabs/[USER](ファイル)

まず、

crontab -e

このコマンドで設定できるcronファイルは/var/spool/cron/crontabs/[user]

例えば、hogeユーザーがこのコマンドを実行した場合は/var/spool/cron/crontabs/hogeに作成される。

  • /var/spool/cron/crontabs/ディレクトリ下はroot権限がないと読み込めない。
  • 一般ユーザーが/var/spool/cron/crontabs/[USER]を編集するにはcrontabコマンドを使うしかない。

/etc/crontab(ファイル)

「システム全体のcronとして実行したいんだよね」という場合は、/etc/crontabに書く。

  • 編集するにはroot権限が必要。

 

また、/etc/crontabは、以下のディレクトリ下にあるシェルスクリプトファイルを以下のタイミングで実行されるようになっている。

  • /etc/cron.hourly  ←1時間毎
  • /etc/cron.daily    ←1日毎
  • /etc/cron.weekly ←1週間毎
  • /etc/cron.monthly   ←1ヶ月毎

 

実際、/etc/crontabには以下のように書かれている。

$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
  • run-partsは「指定したディレクトリ下にあるファイルをすべて実行する」というコマンド。
  • 「anacronが存在する場合は、anacronに任せる」みたいな設定になっているらしい。

 

なので

  • 1時間毎
  • 1日毎
  • 1週間毎
  • 1ヶ月毎

で実行させたいシェルスクリプトの場合は、これらのディレクトリ下に移動させた方が楽。

 

このように、/etc/crontabは「大元の設定ファイル」という感じなので、できる限り編集しないほうが良いっぽい。(Apacheで言うところの大元の設定ファイルであるhttpd.confはなるべく編集せずにモジュール単位で編集すべき」みたいな感じ。)

なのでシステムとして実行したいcronがある場合は、後述する/etc/cron.dに書いた方が良い。

/etc/cron.d(ディレクトリ)

「システム全体のcronとして”任意のタイミング”で実行したいんだよね」という場合は

/etc/cron.dディレクトリ下にcronファイルを追加していく。

  • 編集するにはroot権限が必要。
  • デフォルトだとこのディレクトリ下は空。

まとめ

・基本はcrontabコマンドで設定しておけばOK。

・root権限な必要なcronを実行させる場合は、以下にぶちこむ。

  • /etc/cron.hourly  ←1時間毎に実行させるシェルスクリプトをぶちこむ
  • /etc/cron.daily    ←1日毎に実行させるシェルスクリプトをぶちこむ
  • /etc/cron.weekly ←1週間毎に実行させるシェルスクリプトをぶちこむ
  • /etc/cron.monthly   ←1ヶ月毎に実行させるシェルスクリプトをぶちこむ
  • /etc/cron.d    ←任意のタイミングで実行させたい場合はここにcron設定ファイルをぶちこむ

※すべてroot権限が必要

 

おわり

Ubuntu
スポンサーリンク
この記事を書いた人
penpen

1991生まれ。WEBエンジニア。

技術スタック:TypeScript/Next.js/Express/Docker/AWS

フォローする
フォローする

コメント

タイトルとURLをコピーしました