crontab

今日はcrontab (cron)について書いていきます。

ちょうど業務でcronを使う機会があったので整理したいと思います。

crontabとは

crontabとはUNIX系OSでコマンドを定期実行するためのコマンドです。

例えばユーザーの少ない深夜に時間のかかる重いバッチ処理を行う等、時間や頻度を指定して定期的に行いたい処理を実行するのに使われます。

crontabファイルを開くには

crontab -e

を実行します。

eオプションを付けずに以下のように引数にファイル名を渡すことでそのファイルをcronの設定に使うこともできるようです。

crontab hoge.txt

crontabファイルには以下のような書式で記載します。

* * * * * /hoge/fuga/piyo.sh

先頭から5つあるアスタリスクは左から順に分・時・日・月・曜日番号に対応します。

項目 範囲
0 - 59
0 - 23
1 - 31
1 - 12
曜日番号 0 - 7

曜日番号は0が日曜日、1が月曜日...というように対応しています。7も日曜日です。

アスタリスクにした場合は上記の範囲全体となります。つまり↑の例の場合は毎分実行されます。

各項目はカンマ区切りで複数設定することもできます。以下の例では毎時0分・20分・40分に実行されます。

0,20,40 * * * * /hoge/fuga/piyo.sh

また、ハイフンで範囲を指定することもできます。以下の例では9時から12時まで1時間毎に実行されます。

0 9-12 * * * /hoge/fuga/piyo.sh

間隔を指定することもできます。以下の例では5分間隔で実行されます。

*/5 * * * * /hoge/fuga/piyo.sh

上記の指定方法を組み合わせることもできます。

0,10-30/5 * * * * /hoge/fuga/piyo.sh

設定したcrontab一覧を見るには

crontab -l

を実行します。

crontabの設定をすべて削除するには

crontab -r

を実行します。

コマンド実行時に特定のユーザーで実行したい場合

crontab -e -u {ユーザー名}

rootユーザーの場合、上記コマンドで各ユーザーごとにcrontabの設定を行うことができます。

しかし場合によってはrootユーザーのcrontabの中で特定のユーザーで実行したい場合もあるかもしれません。

そのような場合はsuコマンドを使えば可能です。

* * * * * /bin/su apache -c "/usr/local/bin/php artisan hoge:fuga"

suコマンドでユーザーを切り替えてcオプションでコマンドを実行することで対応できます。

※参考:rootユーザーのcronで別のユーザーとしてコマンドを実行する at softelメモ

cronに設定したコマンドが実行されない場合

まずcronが動いているかを確認します。

systemctl status crond.service

でステータスの確認を行います(CentOS7の場合)。

後は定期実行のログが吐かれているかも確認。ログの保存先は/var/log/cronになっていることが多いようです。

上記いずれも問題ない場合は

  • 登録したコマンド自体が間違っている
  • PATHが通っていない
  • 権限がない

等が考えられます。

rootユーザーで同じコマンドを実行するとOKなのにcronだと上手くいかない等、事象の切り分けが大事だと改めて痛感しました。

まとめ

以上crontabについてまとめてみました。

サーバーやインフラ等の知識がまだまだ不足しているので引き続き勉強していきます。