なんらかの処理を毎月、毎週、毎日のように一定期間で繰り返したいということはLinuxを触っているとよく起こる。
例えば、毎月一回あるディレクトリを見に行って、容量を確認して、管理者にメールを送るなど、自動的にやってくれるととても楽だろう。それを実行できるのが、cronだ。
また一回だけ未来にある処理を実行したい時につかえるのがatだ。
このページではLinuxのジョブスケジューリングに当たる、それぞれの使い方をご紹介しよう。
目次
ジョブスケジューリング
クライアントマシンだけに触れていると、意外に忘れがちなのがジョブスケジューリング「ジョブの定期実行」だ。
実際Windowsクライアントでも定期的に後ろではタスクを実行している。しかし定期実行されているジョブというものは大概バックグランドで走るため、ユーザが意識することはあまりない。
ましてやクライアントの場合ほぼ隠蔽されているといっても過言ではない。時刻の同期やセキュリティー維持のためのWindowsUpdateなどは気がつかないうちに実行されているということが多々ある。これら同期やアップデートなどの自動実行は非常に重要である。
手動でやってできないことではないのだが、忘れることが多々ある。なので定期的に行いたい動作は「定期実行」のためのプログラムにまかせたほうが無難だ。
Linuxの場合クライアントというより、サーバとして使用されていることが多いだろう。アップデートの定期実行、及び時間の同期は勿論、データの定期バックアップや定期的なステータス報告など定期実行してほしいタスクは多々でてくる。
「定期実行」してほしいときは「cron」「一度だけ時刻指定でジョブを実行する」場合「at」を使用することになる。ジョブの定期実行をおこなうと管理コストが削減できるので積極的に活用しよう。
cron
「cron」は比較的に古くから存在し、現在でも現役なプロセススケジューリングデーモンである。UnixLikeSystem上で定期実行といったらcronといっても過言ではない。ただしLinuxでは「SytemD」に定期実行の機能が追加されているので、そちらを使うという流れもある。
インストールと稼働の確認
CentOS7ではデフォルトでは「cronie」がインストールされる。インストールされていなかった場合
# yum install cronie
としてインストールする。
状態を確認する。
# systemctl status crond
もしサービスが走っていなかった場合
# systemctl start crond
としてサービスを開始する。
起動時に自動的に起動するように設定するには
# systemctl enable crond
とする。
一般ユーザでのcron
一般ユーザの状態で
$ crontab -e
とするとviが起動しユーザ固有のcron設定ファイルが生成される。
書式は
分 時 日 月 曜日 実行コマンド
である。例えば
20 * * * * /home/hoge/cron/backup.sh
とすると結果的に毎時20分にbackup.shを実行することになる。バイナリコマンドだけでなく自作のスクリプトなども指定できるので便利だ。
crontabコマンドは以下のようなオプションが存在する。
- -e ユーザのcrontabを編集する。
- -l 内容を表示する。
- -r crontabファイルを削除する。
- -i crontabファイルを削除する。(確認をとる)
- -u rootのときにユーザを指定してcrontabを編集する。
システムワイドの場合
「/etc/crontab」に記述する書式は上記とほぼ同じだ。ただしある程度環境変数をしていしたり、ユーザを指定したりすることが出来る。
- SHELL 実行時のシェルの指定
- PATH コマンドのパスの指定
- MAILTO メッセージをメールとして誰に送るか?
- HOME カレントディレクトリの指定
実際のジョブ指定は基本的には以下のような書式となる。
分 時 日 月 曜日 ユーザ名 実行コマンド
例
20 * * * * root /usr/bin/backup.sh
他、細々としたディレクトリがあるそれぞれに役割がある。名前の通りになっている。
- /etc/cron.d/ 各種ジョブを記述したファイルを収めたディレクトリ
- /etc/cron.houly 一時間ごとに実行されるファイルを収めたディレクトリ
- /etc/cron.daily 一日ごとに実行されるファイルを収めたディレクトリ
- /etc/cron.weekly/ 一週間ごとに実行されるファイルを収めたディレクトリ
- /etc/cron.monthly 一ヵ月ごとに実行されるファイルを収めたディレクトリ
アクセス制御に関して
/etc/cron.allow
ここに許可するユーザを記述する
/etc/cron.deny
ここに拒否するユーザを記述する
基本的に許可したユーザだけにcronを実行させたいのならば「/etc/cron.allow」にユーザを記述すればよい。その場合「/etc/cron.deny」は無視される
at
未来に一度だけコマンドを実行してほしい場合は「at」コマンドを実行するとよい。
インストールと稼働の確認
ほぼデフォルトでインストールされているはずだが一応に確認しよう、もしインストールされていなかったら以下のコマンドを叩く。
# yum install at
としてインストールする。
状態を確認する。
# systemctl status atd
もしサービスが走っていなかった場合
# systemctl start atd
としてサービスを開始する。
起動時に自動的に起動するように設定するには
# systemctl enable atd
とする。
実際にジョブをスケジュールしてみる。
$ at "19:15 17.10.16" -f backup.sh
とすると2016年10月17日19時15分にbackup.shが実行される。シンプルなコマンドである。
-f オプションを指定すると指定したコマンドが記述されたファイルを実行する。
特殊な時間指定
時間指定の部分で特殊な書式が用意されているので、活用してみるとよいだろう。
- 10pm 午前午後の指定 今回は22:00を指定
- noon 正午
- midnight 真夜中
- today 今日
- tomorrow 明日
- <N> days 例えば now + 4daysで4日後に実行される
- <N> weeks 例えば 9pm + 3 weeks 3週間後の21:00に実行される。
例えば
$ at 10pm -f backup.sh
などである。
ジョブを確認するときは
$ at -l
もしくは
$ atq
ジョブを削除するときは
$ at -d <ジョブ番号>
もしくは
$ atrm <ジョブ番号>
となっている
アクセス制御に関して
/etc/at.allow
ここに許可するユーザを記述する
/etc/at.deny
ここに拒否するユーザを記述する
基本的に許可したユーザだけにatを実行させたいのならば「/etc/at.allow」にユーザを記述すればよい。その場合「/etc/at.deny」は無視される。
まとめ
このページではcronやatによる処理の定期実行・未来実行についてまとめてお伝えした。
cronの使い方は特に、Linuxエンジニアとして活動するなら必須の知識だ。頭に入れておこう。