【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【予約システム開発】EDISONE カスタマイズ開発サービス

【予約システム開発】EDISONE カスタマイズ開発サービス

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【200ヶ国以上に対応】グローバル eSIM「ビヨンドSIM」

【200ヶ国以上に対応】グローバル eSIM「ビヨンドSIM」

【中国への旅行・出張・駐在なら】中国SIMサービス「チョコSIM」

【中国への旅行・出張・駐在なら】中国SIMサービス「チョコSIM」

【グローバル専用サービス】北米・中国でも、ビヨンドのMSP

【グローバル専用サービス】北米・中国でも、ビヨンドのMSP

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【Linux】CRONの時刻書式と実行間隔でハマったポイント

こんにちは。

最近AWSとGCPの資格を取りました、システムソリューション部の宮崎です。
202まで目標だったLPICは000です。

今回はCRONの時刻書式と実行間隔を設定する時にハマったポイントについて書いていきたいと思います。

CRONの時刻書式

まず最初に、CRONで指定できる時刻や日付は以下の通りです。
参考 : Man page of CRONTAB

フィールド 指定可能な値
0-59
0-23
月内日 1-31
1-12
曜日 0-7

これを元に以下に設定例を記載します。

# db_backup.shを04:00に実行する
0 4 * * *       /home/centos/db_backup.sh
# 30分毎にrsyncする
*/30 * * * *      /home/centos/rsync.sh
# 毎月15日に集計する
* * 15 * *      /home/centos/count.sh
# 毎週月曜日にファイルを削除する
* * * 1 *       /home/centos/delete.sh
# 1分毎に実行する
* * * * *     /home/centos/1hunoki.sh

こんな感じですね。
他にもいろいろあるかと思いますが、今回ハマった点というのが45分間隔で実行する場合でした。

45分間隔で実行する場合

さて、45分間隔でシェルスクリプトを実行したい場合どのように設定すればよいでしょうか。
最初はこれでいけそうだなと設定してみました。

#45分間隔で実行する
*/45 * * * *     /home/centos/45hunoki.sh

はい、これ不正解です。

cronのログを確認すると

[root@test-server ~]# cat /var/log/cron
Sep 21 19:45:01 test-server CROND[3890]: (root) CMD (/home/centos/45hunoki.sh)
Sep 21 20:00:01 test-server CROND[3894]: (root) CMD (/home/centos/45hunoki.sh)
Sep 21 20:45:01 test-server CROND[3899]: (root) CMD (/home/centos/45hunoki.sh)

00分と45分に実行されていました。なんで・・

こうなる理由ですが、「*/45」の「*/」は決して0-24時の間のすべての「分」を考慮しているわけではないからです。
この言い方わかりにくいですね。
つまり、00:59,01:00,01:01と考えているわけでないということです。

*/45は置き換えると、00-59/45となります。
よって00と45を指定している意味になります。

ちなみに、01-12/3とした場合
01,04,07,10を指定していることになります。

*/9 であれば、0,9,18,27,・・・54,0です。
注意点ですが54の次は0に戻ります。

CRONのMANには以下のような記載があります。

間隔値を範囲とともに指定することもできる。 範囲の後に ``/'' と指定すると、 範囲内で指定数値ずつ飛ばすことになる。 例えば「時」フィールドに ``0-23/2'' と指定すると、 コマンドは 2 時間おきに実行される

Man page of CRONTAB

これを考慮した上で45分間隔で実行したい場合、結論から言えば以下のようにするのが正しいです。

*/45 */3 * * *        $45hunoki.sh
30 1-22/3 * * *       $45hunoki.sh
15 2-23/3 * * *       $45hunoki.sh

45分おきにすると、このような規則性ができるんですね。
・0時から3時間おきに00分と45分に実行
・1時から22時まで3時間おきに30分に実行
・2時から23時まで3時間おきに15分に実行

00 15 30 45
0時台 00:00 00:45
1時台 1:30
2時台 02:15
3時台 03:00 03:45
4時台 04:30
5時台 05:15

表にしてみると、40分毎でも50分毎でも規則性がみえてきます。

まとめ

*/45大丈夫だろうと思っていた自分が恥ずかしいです。
改めてMANを見ると気づくことがたくさんありました。
一度紙に書いてみたりすると、案外簡単に規則性に気付くのでオススメします。

以上です。

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
4
読み込み中...
4 票, 平均: 1.00 / 14
54,008
X facebook はてなブックマーク pocket
【2025.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

【2025.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

この記事をかいた人

About the author

宮崎健太

2017年に新卒でビヨンドに入社しました。

主にWeb系のサービスを展開する企業が利用するサーバー / クラウドに対して、24時間365日の運用保守・監視サービスの提供をおこなっています。
システムソリューション部に所属しており、ビヨンドの運用をよりよくし、お客様がお客様のビジネスに専念できますように、という思いで仕事をしています。

所有資格:AWS Certified Solutions Architect、GCP Professional Cloud Architect、Linuc1