目次
ジョブスケジューリング
ジョブスケジューリングは時間を設定してコマンドやスクリプトを実行するシステムのことです。Linux / Unixではcronが代表的なジョブスケジューラです。タスクスケジューラは一度だけでなく定期的に実行できます。一度だけ実行させたい場合はatコマンドなどを使います。
cronの使い方
cronは人が手を加えなくても自動で実行することから最も単純な自動化方法として保守・管理などに利用されます。定期的にログをとったり、ファイルを送信したりするのに利用します。
cronを実行するにはcrondというデーモンを起動しておく必要があります。待機しているデーモンが期日が来た時に実行させます。
crondの起動をsystemctlコマンドから確認してみます(CentOSではcrond, Ubuntuではcron)。
$ systemctl status cron
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-07-23 19:09:48 JST; 1 day 23h ago
crondが実行(Active runnnnig)されていなければ、cronを登録していても実行はされません。また、実行させていても何らかの理由でcrondが落ちてしまっていたら実行されなくなります。また、自動起動にしていないと再起動した際にcrondが自動的に上がらなくなるなど、cronが正常に実行されないトラブルがよく起こるので注意しましょう。
cronの定期実行を登録する
cronに登録するには /etc/crontab または /var/spool/cronファイルを直接編集してタスクスケジュールを書き込むまたは、crontabコマンド crontab -eで設定ファイルを編集します。また、外部ファイルを読み込ませることもできます。
- /etc/crontab →システムのcrontabファイルはここでrootで実行される
- /var/spool/cron →ユーザのcrontabファイルでユーザがcrontab -eではここに置く
crontabコマンド
- crontab -e cron設定編集画面
- crontb -u root -e →-uでユーザを指定
- crontab -l で登録されたものを確認
- crontab -r 一括削除
cronの書式
分 時 日 月 曜日 コマンド
書式は上のようになります。例えば、8月の木曜日の9時0分、21時0分にechoコマンドでhelloを表示するというタスクスケジュールは下記のような記述になります。
0 9,21 * 8 4 echo “hello”
アスタリスク*は設定しないになります。しかし、分の部分を*にすると毎分という意味になります。上の例で分の0を*にすると8月の木曜日の9時毎分、21時毎分echoコマンドでhelloを表示するという意味になります。一見難しそうに見えますが一度理解すれば簡単です。(曜日は0または7が日曜日です)
細かい設定注意点
- 3分毎に設定したいときは*/3というように記述する
- 7-9のように範囲指定もできる
- カンマで複数設定できる 2,3,4→2,3,4月など
- スクリプトを実行する場合は権限に注意
外部ファイルをcrontabに読み込ませる
crontabコマンドで-rを実行するとcron設定がすべて消えます(eの右隣りのキーがr)。誤って設定を消去しても復活できるように、cronの設定はcrontabで直接書き込むのではなく、外部ファイルを作ってcrontabに読み込ませてコピーさせるのが安全です(crontab -lで内容を確認する癖をつけると誤って消してもコンソールの履歴から戻せるので安全)。
外部ファイルにはcrontabの書式で記述します。例えばcronjob_202007という設定を書き込んだファイルを作ったら
$ crontab cronjob_202007
とすればcrontabに設定が読み込まれます。cronjob_202007の内容は残ったままになるのでこれを保存しておけば誤って消してもこのファイルを再度読み込めば設定を復活できます。設定が入っているかは$ crontab -eや-lで確認してみましょう。
cronが動かない時に確認すること
- crontabの中身はあるか?
- crontabの書式は正しいか?
- crondはactiveかつenableか?
- システム時刻とcron時刻はずれていないか、JSTか?
- cronのログを確認 /var/log/cron
- スクリプトファイルに実行権限が付与されているか?
- 出力リダイレクト先のファイルに書き込み権限があるか?
- ファイルのパスに誤りはないか?(絶対パスで書く)
- cron以外の原因か?通信不良、スクリプトのバグなど
atコマンドの使い方
atコマンドは指定した処理を一度だけ実行するのに利用するジョブスケジューラです。似たものにbatchがありますが、batchは時刻ではなく、システムの負荷量によって処理を実行、負荷が低くなったときに実行します。
書式
- at 12:00 → 12時に実行
- at 12:00 +1 days → 明日の12時に実行
- at 07252020 → 2020年に7/25に実行
- at now +1min → 今から1分後に実行
登録は上記の時刻設定コマンドを入力するとat >という画面がでてきます。そこで実行したいジョブを登録します。入力を終えたらCtrl+dで終了します。ジョブの確認は$ at -l 、ジョブの削除は$ at -d (番号) でできます。
$ at 12:00
warning: commands will be executed using /bin/sh
at> echo "hello"
at> <EOT>
job 1 at Sun Jul 26 12:00:00 2020 →登録されたタスク
$ at -l
1 Sun Jul 26 12:00:00 2020 a komeyan →ジョブ番号1の登録内容
$ at -d 1 →登録されたatジョブを削除
$ at -l
$