【Ubuntu】cron(crontab)でプログラムを定期的に実行:ジョブスケジューリング

2022.04.30 /

【Ubuntu】cron(crontab)でプログラムを定期的に実行:ジョブスケジューリング

本記事ではLinux系OSのUbuntuによる、プログラム(処理)を定期的に実行する方法について解説していきます。

Windowsではタスクスケジューラーで定期実行を計画できるように、Linxではcroncrontab)を利用してプログラムの定期的な実行を行います。

システムの保守や決められた時刻にコマンドを実行したい場合など、様々な場面でcronは利用されますので、Liuxを扱うエンジニアには必須の知識です。

本記事で使用しているUbuntuのバージョンはUbuntu Server 20.04.3 LTSです。

cron(crontab)

cronとは

cron(クーロン)とはLinx系OSで用意されている、定期的にプログラム(スクリプト)を実行してくれる機能です。cronはLinuxに昔から標準で入っています。

指定した時間にプログラムを走らせてくれるので、バッチ処理やバックアップなど定期的に実行する必要がある処理に対して利用することが多いです。

cronはユーザー毎に設定でき、cron設定ファイルに設定を記述します。

cronの設定方法

cronの設定方法は以下に記す2つ方法があります。

  • crontabコマンドを使用した方法
  • 「/etc/cron.d/」のファイルを編集する方法

crontabコマンドでcronを設定する方法は非推奨とされています。理由としては誤ったコマンド実行によりcron設定をすべて削除してしまうことがあるからです。(crontab -eをcrontab -rとして実行するとすべて削除される)

そのため/etc/cron.d/にファイルを作成する方法がよく利用されます。

ここでは両方の方法を解説していきますので、好きな方を利用してください。

crontabコマンドを使用したcron設定

crontabコマンドを利用することで、ファイルを編集せずにユーザー毎の設定を編集できます。

cron:タスク(スケジュール)の確認

cronのタスクを確認するには以下コマンドを実行します。実行すると現在ログインしているユーザーのcron内容が表示されます。

$ crontab -l

lはlistを意味します。cronがなにも設定されていない場合は以下メッセージが表示されます。

$ crontab -l
no crontab for ユーザー名

初期設定ではcronはなにも設定されていないため、必ず上記のメッセージが表示されます。

cron:タスクの設定(ジョブスケジューリング)

cronによるタスク(ジョブスケジューリング)を設定するには以下コマンドを実行します。

$ crontab -e

eはeditを意味します。上記コマンドを実行するとcronの設定ファイルが開かれて、編集状態になります。(デフォルトで開かれるエディタはnanoです)

この開かれた設定ファイルに、以下構文に沿って実行するスケジュール(日付と時間)と実行するコマンドを記述していきます。

構文

min hour dom month dow command

min 分の意味、0~59を指定
hour 時間の意味、0~12を指定
dom 日(day of month)の意味、1~31を指定
month 月の意味、1~12またはjan-decを指定
dow 週(day of week)の意味、0~7またはsun-satを指定(0と7は日曜日)
command 実行したいコマンドを指定

上記のmin、hour、dom、month、dowにはすべてを意味する*(ワルイドカード)を指定できます。

例えば毎日5時40分に実行したい場合は次のように記述します。

40 5 * * * /bin/bash /home/ubuntu/test.sh

上記コマンドを実行してファイルを保存すると、/var/spool/cron/crontabsにユーザー名のファイルが生成されます。例えばubuntuというユーザーでcrontab -eを実行すると/var/spool/cron/crontabs/ubuntuというファイルが生成されます。

その他の日時の指定例を以下に記します。ぜひスケジュールを組む際に参考にしてください。

日時の記述 説明
0 7 * * * 毎日午前7時0分
0,30 * * * * 毎日毎時0分と30分
*/5 * * * * 5分ごと
0 9-17 * * * 毎日9時~17時まで毎時0分
0 7 1 * * 毎月1日の午前7時0分
30 7 * * 0 毎週日曜日の午前7時30分

cron:cronの削除

以下のコマンドを実行することで作成したcronを削除することができます。

$ crontab -r

キーボードでcronを作成する「e」の隣の「r」を利用するため、間違えてcronを削除してしまう事例が非常に多いです。

そのためcrontabでのcronの作成は非推奨とされています。

cron:設定ファイル編集時のエディタ変更

「crontab -e」を実行した際に起動するエディタは初期設定ではnanoです。起動するエディタをvimに変更したい場合は以下コマンドを実行します。

$ update-alternatives --config editor
There are 4 choices for the alternative editor (providing /usr/bin/editor).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /bin/nano            40        auto mode
  1            /bin/ed             -100       manual mode
  2            /bin/nano            40        manual mode
  3            /usr/bin/vim.basic   30        manual mode
  4            /usr/bin/vim.tiny    15        manual mode

Press <enter> to keep the current choice[*], or type selection number:

vimに変更するには3を選択します。

cron:ログを確認

cronの実行ログを確認するには以下コマンドを実行します。

$ less /var/log/syslog | grep CRON

cron:スケジュールの作成例

以下にcrontabコマンドによるスケジュール作成例を記します。

  1. 「crontab -e」を実行
  2. 「*/5 * * * * ubuntu /bin/bash /home/ubuntu/test.sh >> /home/ubuntu/cron.log」を記入し保存
  3. 「vim /home/ubuntu/test.sh」を実行
  4. 「echo 'hello world'」を記入し保存
  5. 「systemctl restart cron」を実行
  6. 5分後に「cat /home/ubuntu/cron.log」を実行
  7. 「hello world」と表示されることを確認

上記の流れでスケジュールの作成およびスケジュールが実行されていることが確認できます。

スケジュールのコマンドでは「>>」を使用しています。「>>」で指定したファイルにコマンド実行による標準出力およびエラーを書き込みます。

「/etc/cron.d/」のファイルを編集する方法

/etc/cron.dディレクトリ内に拡張子のないファイルを作成し、実行するスケジュールとコマンドをcrontab -eと同じように記述します。

ただ実行するユーザー名も指定する必要がありますので、忘れないように注意してください。

構文

分 時 日 月 曜日 実行するユーザー名 コマンド

これだけで「crontab -e」と同じ操作を行ったことになります。以下にcronを作成する例を記します。

  1. 「vim /etc/cron.d/ubuntu」を実行
  2. 「*/5 * * * * ubuntu /bin/bash /home/ubuntu/test.sh >> /home/ubuntu/cron.log」を記入し保存
  3. 「vim /home/ubuntu/test.sh」を実行
  4. 「echo 'hello world'」を記入し保存
  5. 「systemctl restart cron」を実行
  6. 5分後に「cat /home/ubuntu/cron.log」を実行
  7. 「hello world」と表示されることを確認

上記の流れでcronによるコマンドの定期実行が行われていることが確認できます。

cron:systemctlコマンドでの操作

systemctlコマンドによるcronサービスの操作方法を見ていきましょう。

Linuxで利用できるsystemctlコマンドについては以下記事をご参照ください。

cron:状態確認

cronの状態確認は以下コマンドを実行します。

$ systemctl status cron

「Active: active (running)」と表示されれば、現在cronサービスが稼働していることを意味します。

cron:起動

cronを起動するために以下コマンドを実行します。

$ systemctl start cron

cron:停止

cronを停止するために以下コマンドを実行します。

$ systemctl stop cron

cron:再起動

cronを再起動するために以下コマンドを実行します。

$ systemctl restart cron

まとめ

本記事「【Ubuntu】cron(crontab)でプログラムを定期的に実行:ジョブスケジューリング」はいかがでしたか。

cron機能はLinuxサーバーの保守作業を行っている方やLinuxでサービスを提供しているエンジニアには必須の知識です。

実際にcronを使って定期処理を実行して、理解を深めていってください。