今回はコマンドやプログラムをきまった時間に自動実行してくれる機能cronの使い方について紹介してきます。
作業をする時、ひたすら同じ作業をすることはないでしょうか_
そんな時はcronを利用することにより、決まった時間に指定したコマンドを自動でやってくれます。
今回の記事ではcronに関する使い方を解説していきます。
最後まで読むことにより以下のことがわかります。
この記事でわかる事
・cronの使い方
・cronを利用する際に使うコマンド
・cronの豊富な実行例を通してわかる利用例
お待たせしました。それでは紹介していきます。
cronとは
cronとは登録したプログラムやコマンドを指示した日時に自動で実行してくれる機能です。
例えば業務時間外に1日のたまったアクセスログの情報や不要なファイルなどを「特定のディレクトリにすべて移動」といった自動化をすることができます。作業の効率化進めることができます。
crontabファイルに日時や時間・実行したいコマンドやシェルスクリプトと記載します。そのごシステムに常駐するデーモンcronがこれを読み込んで指定したスケジュールにしたがって実行します。
crondはバックグラウンドで稼動し、毎分ごとに実行すべきスケジュールがないか確認し、もし実行すべきジョブがあれば、それを実行する。このジョブは「cron job」とも呼ばれます。
cronサービスの起動状況について
cron の設定や実施をする前に、まずサービスが起動状況にあるかどうか確認する必要があります。
cron起動状況
systemctl status cron
cron設定方法について
主な設定方法は2通りあります。両方ともcrontabファイルにパラメータを記述して、設定します。
「ユーザ別に作成する個人専用のcrontabファイル」と「全体の設定で自動実行されるcrontabファイル」があります。
ファイルの種類
・ユーザ別に作成されるファイルが格納されるディレクトリ
/var/spool/cron/crontab/
・全体で適応される設定ファイル
/etc/crontab
ユーザ毎の設定ファイル
「crontab -e」コマンドを使用することで「ユーザ毎の設定ファイル」を作成することができます。
ユーザ毎の設定方法としてパスを指定してファイルを開くのではなく、コマンドを通してファイルを作成・編集・削除を行います。
それでは記述方法について解説していきます。
1行に1項目で「分 時 日 月 曜日 実行するコマンド」という書式で記述します。
それぞれの項目には特定の時間を指定したり、間隔ごとに曜日を指定したりと、いろんな指定パターンがございます。それについては後述します。
設定完了後、cronはその設定を読み込み実行してくれます。
反映されるのはcronの実行時間が例として1分の場合、1分1秒よりスタートされます。
下記例ではユーザ毎のcrontabファイルの記述例です。
ユーザ毎のcrontabファイル
# m h dom mon dow command
*/1 * * * * echo "test" >> /home/mitsu/mitsutest
/etc/crontab設定ファイル
個別ユーザだけでなく全体で自動実行したい場合に/etc/crontabファイルを利用します。
個別ユーザの定義ファイルの違いとして、指定する項目に「ユーザ名」を追記します。
1行に1項目で「分 時 日 月 曜日 ユーザ名 実行するコマンド」という書式で記載します。
ユーザ名を記載しなかった場合コマンドは実行されません。そのため決まった書式で記載する必要があります。
一般ユーザを記載する場合は、そのユーザで指定したコマンドが、権限上実行できるか考えた上で記載するする必要があります。
ユーザ名に関して記述ミスをすると下記のような表示がされます。
ユーザ名の記述間違い
1月 28 12:45:18 miitsu-computer systemd[1]: Started Regular background program processing daemon.
1月 28 12:45:18 miitsu-computer cron[9892]: (CRON) INFO (pidfile fd = 3)
1月 28 12:45:18 miitsu-computer cron[9892]: Error: bad username; while reading /etc/crontab
1月 28 12:45:18 miitsu-computer cron[9892]: (*system*) ERROR (Syntax error, this crontab file will>
1月 28 12:45:18 miitsu-computer cron[9892]: (CRON) INFO (Skipping @reboot jobs -- not system start
ユーザ名を未記述にするとbat usernameと出力されます。コマンドは実行されません。
下記例ではcrontabの例を示しています。
/etc/crontab設定ファイル記述例
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
*/1 * * * * root echo "test rooot" >> /root/roottest
「crontab -e」コマンドを実行すると通常エディタが表示されますが、Linux の種類によっては「vi」「nano」といった標準エディタが変わります。
エディタがうまく起動しない場合、下記のような表示がされます。
エディタが起動しない場合
root@miitsu-computer:/usr/bin# crontab -e
no crontab for root - using an empty one
889
環境変数で指定したエディタを定義すると使用できます。
その場合VISUAL環境変数を定義し、使用するエディタの値を入れます。今回はnanoエディタで試してみます。
VISUAL県境変数にnanoを代入
root@miitsu-computer:/etc/alternatives# export EDITOR=nano
root@miitsu-computer:/etc/alternatives# echo $EDITOR
nano
root@miitsu-computer:/etc/alternatives#
再度「crontab -e」実行すると「nano」エディタで開くことができます。
各フィールドで設定可能な数値
時間や日時指定するフィールドでどのような指定方法があるか紹介していきます。
「分」「時」「日」「月」「曜日」のフィールドに指定できる数値は下記の通りになっています。
各フィールドはスペースやタブで区切ります。
実行したい時間を「指定、範囲、間隔」指定し設定方法と組み合わせて実行する時間を設定します。
指定項目
設定項目 | 数値 | 説明 | 備考 |
分 | 0-59 | 0-59指定した時刻にコマンドを実行する | 値は指定するパターンとアスタリスクを指定するパターンがあります。「*」(アスタリスク)は各項目で設定できる全ての値を設定していることになります。 |
時 | 0-23 | 0-23指定した時刻にコマンド実行する | |
日 | 1-31 | 1-31指定した日にちにコマンド実行します。 | |
月 | 1-12 | 1-12指定した月にコマンドを実行します。 | |
曜日 | 0-7or曜日指定 | 0=日、1=月、2=火、3=水、4=木、5=金、6=土、7=日 |
指定項目の指定方法について紹介していきます。値を複数指定、範囲や、間隔での指定の仕方があります。
指定方法
指定方法 | 説明 | 設定例 |
指定 | 0,15,30,45,59など 「,」で区切ることで複数指定が可能です。 | 分フィールド指定した場合は指定した0,15,30,45,59分に実行します。「,」で区切ることで、複数の値を設定することが出来ます |
範囲指定(range) | 1-5 「-」で範囲指定が可能 | 月フィールドで指定した場合1,2,3,4,5月に処理を実行します |
間隔指定 | */10 「*/数値」で間隔を設定することが可能 | 分フィールドで指定した場合、10分間隔で処理を実行します。「/」の後ろに指定した値の間隔で処理を実行します |
ユーザ名
ユーザ名にはコマンドを実行するユーザ名を記述します。
注意するポイントはコマンドが、指定するユーザで権限が付与されている範囲で実行できるか気にする必要があります。ただし
/etc/crontabと/etc/cron.d内のファイルに記述際にユーザは必要となりますが、個別ユーザ用の設定ファイルにはユーザ名は不要です。
ちなみにホームディレクトリを示す「〜」がありますが、ユーザ名にきさいするとエラーがおきるため、しっかりユーザ名を記載する必要があります。
注意
システム上で設定する「/etc/crontab」「/etc/cron.d/」内の設定ファイルの書き方にはユーザの記載が必要
crontab -eで作成される個別のユーザ毎のcrontabファイルではユーザ名は不要
コマンド
実行したいコマンドを記述します。コマンドを実行するにあたり、記載間違いがないように注意が必要です。
run-partsコマンド
run-partsコマンドはcronでよく使われます。
引数に指定したディレクトリ内のスクリプトを全て実行するコマンドです。
/etc/cron.monthlyといったディレクトリ内のスクリプトをすべて実行する際に利用するため、デフォルトで記載されている場合があります。
環境変数
必要に応じて記述が必要です。cronで実行させる際に一時的に使用したいシェルの変更または実行結果を特定のメールに送りたい場合に記述します。
変数 | 説明 |
SHELL | cronで使用するシェルを設定します。 |
PATH | 環境変数PATHを定義することができます。PATHに定義していないコマンドを利用する場合に、PATHをここで定義することができます。 |
MAILTO | cronの実行結果を送るユーザまたはメールアドレスを指定します。メールを送信したくない場合は「MAILTO=""」と設定します。 |
HOME | cronが実行されるカレントディレクトリを指定します。 |
cronの設定ファイルの種類
cronにはあらかじめ決まった日に自動実行してくれるディレクトリが存在しますので、紹介します。
ファイル・ディレクトリ | 説明 | 備考 |
/etc/crontab | 毎時、毎日、毎月、毎週の自動タスクのメイン設定ファイル | |
/etc/cron.houly | 毎時実行される自動タスク設定ファイルを置くディレクトリ | |
/etc/cron.daily | 毎日実行される自動タスク設定ファイルを置くディレクトリ | |
/etc/cron.monthly | 毎月実行される自動タスクをファイルをおくディレクトリ | |
/etc/cron.weekly | 毎週実行される自動タスク設定ファルを置くディレクトリ | |
/etc/cron.d | 上記以外の自動設定ファイルを置くディレクトリ | 書式は/etc/crontabと同様。 |
/var/spool/cron/crontabs/ユーザ名 | 全ユーザ ユーザの自動タスク設定ファイル | コマンドを利用して操作するため、直接参照はしない。 |
/etc/cron.allow | 記述したユーザをcronで利用する事を許可します | |
/etc/cron.deny | 記述したユーザをcronで利用する事を拒否します |
crontab コマンド
crontabとは、Linux系などの標準OSに用いられる定期実行システムであるcronの設定を行うコマンドです。
主に利用するコマンドは「crontab -e」で編集、「crontab -l」で設定情報を確認します。
書式
crontab [オプション]
オプション
オプション | 説明 |
-e | crontabファイルを作成・変更などを行います。-eオプションはVISUAL変数(またはEDITOR変数)で指定されたエディターを使用して現在のcrontabを編集するために使用されます。 |
-l | crontabファイルの表示をします。 |
-r | 現在の設定を消去します。 |
-u | 特定ユーザーのcrontabファイルを編集します。(rootユーザのみ使用可能) |
-i | 確認メッセージを表示します。 |
実行例
それではコマンドの使い方、ファイルの記載例や実行例を紹介していきます。
個別ユーザのcrontabファイルの記載の際、ユーザ名は省略します。/etc/crontabや/etc/cron.d/での設定を行う方はユーザを記述した上で記載してください。
-e:ファイル編集
「crontab -e」でcrontabファイルの作成・変更などを行います。実行するとエディタが開かれます。
※エディタは環境により変わります。
crontab mitsuユーザの定義情報の一部
*/1 * * * * echo "test echo path" >> /home/mitsu/pathmitsu
-u:ユーザ指定
特定のユーザのcrontabを設定をしたい・削除したいなど他のオプションと併用して利用します。ただしroot権限が必要です。
crontab -e -u mitsu
-l:設定内容の表示
crontabの設定内容を表示します。
「-u」オプションと併用することによりそのユーザの設定情報を確認できます。
crontab -u mitsu -l
-r:設定削除
crontabファイルに設定されている設定情報を削除します。
mitsu@miitsu-computer:~/デスクトップ$ crontab -r
mitsu@miitsu-computer:~/デスクトップ$ crontab -l
no crontab for mitsu
mitsu@miitsu-computer:~/デスクトップ$
・-i 削除時に確認
crontabの設定を割くよする「-i」オプションと一緒に使用することで、削除する前に確認のメッセージを与えることができます。下記のようにユーザmitsuのcrontabファイルを削除するか確認が入ります。
mitsu@miitsu-computer:/tmp$ crontab -i -r
crontab: really delete mitsu's crontab? (y/n)
1分に特定のファイルに文字列を出力します
毎1分に/home/mitsu/1minファイルに"test min"1を追記します。
1 * * * * echo "test min" >> /home/mitsu/1min
23時に特定のファイルに文字列を追記します
23時に/home/mitsu/23hourファイルに文字列を追記します。
* 23 * * * echo "test hour" >> /home/mitsu/23hour
毎月の1日に特定のファイルにメッセージを追記します
毎月の1日に特定のファイルにメッセージを追記します。
* * 1 * * echo "test day" >> /home/mitsu/1day
1月に特定のファイルにメッセージを追記します
1月に特定のファイルにメッセージを追記します。
* * * * 1 * echo "test month" >> /home/mitsu/1month
日曜になったら特定の文字列を追記します
日曜日になったら特定の文字列を追記します。
* * * * * 0 echo "test sun" >> /home/mitsu/1sun
特定指定
パラメータを指定することでその時間に自動実行できます。4:00と12:00の59分にコマンドを実行します。
59 4,12 * * * echo "test" >> /home/mitsu/testtokutei
範囲指定
「-」で指定することで、範囲指定することができます。毎月25日の 4:00,5:00,6:00時 にコマンドを実行します
00 4-6 25 * * echo "test " >> /home/mitsu/range1
間隔指定
「/」の後に実行したい間隔の値を設定することで、その間隔で実行することができます。1分毎に実行したい場合は下記のように記載します。
*/1 * * * * echo "test" >> /home/mitsu/test1min
アクセス制御
cronを利用するユーザを制御する方法があります。cron.allowに許可するユーザを、cron.denyに許可しないユーザを記載します。
注意としてアクセス順序は下記の順番でチェックされます。
これらのファイルは以下の順序で評価されます。
①cron.allowファイルが存在し、ファイルに記載されているユーザが許可れます
②cron.allowが存在せず、cron.denyが存在する場合cron.denyに記載されているユーザが拒否されます。
③どちらのファイルも存在しない場合、すべてのユーザがcronを利用できます。
拒否メッセージ
/etc/cron.denyに記述された状態で「crontab -e」
を実行すると以下のようにエラーメッセージがでます。
/etc/cron.denyによるエラーメッセージ
mitsu@miitsu-computer:~/デスクトップ$ crontab -e
You (mitsu) are not allowed to use this program (crontab)
See crontab(1) for more information
cronサービスのログ情報
cronの実行ログは「systemctl cron status」コマンドでも確認できます。
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2022-01-29 12:49:33 JST; 1 day 3h ago
Docs: man:cron(8)
Main PID: 449 (cron)
Tasks: 1 (limit: 2273)
Memory: 1.2M
CGroup: /system.slice/cron.service
└─449 /usr/sbin/cron -f
1月 30 15:56:01 miitsu-computer CRON[37677]: pam_unix(cron:session): session closed for user mitsu
1月 30 15:57:01 miitsu-computer CRON[37705]: pam_unix(cron:session): session opened for user mitsu
過去にsystemctlについて執筆しましたので、興味ある方はご覧ください。
まとめ
本記事は以上となります。まとめに入ります。
まとめ
cronはコマンドやプログラムを指定した時間に実行してくれる機能です。
定型業務や早朝・夜中といった時間に自動的に作業を行なってくれるので、とても便利です。
自動化作業がエラーが起きた場合の対策や予想外の動きの対策が必要です。
以上となります。業務に利用するとなると検証が必ず必須になります。ぜひいろんなパターンで試し、業務効率かに役立てて行ってください。
当メディアではLinuxに関する内容や役立つ情報を提供しているので、興味ある方はぜひご覧ください。