cron
ユーティリティは、スクリプトとコマンドを定期的な間隔で、特定の日時に実行するために使用されます。これはほとんどの Linux ディストリビューションに組み込まれており、サーバー上でタスクをスケジュールするための非常に便利な方法を提供します。
cron
自動化ツールであるため、定期的に実行するものはすべて cron ジョブに切り替えることができます。毎日定期的にバックアップを作成したり、週に 1 回サービスを再起動したりしたい場合は、
cron
使用してそれを行うことができます。
クロンはどのように機能しますか?
cron ジョブは、crontab と呼ばれるファイルで定義されます。このファイルは各ユーザーに固有であり、通常は次の場所にあります。
/ var /spool/cron/crontabs
、直接編集することを目的としていません。代わりに、次の方法で編集します。
crontab
指示:
crontab -e
これにより、デフォルトの CLI テキスト エディタでユーザーの crontab が開きます。これで vim で行き詰まった場合は、一部のシステムで
select-editor
実行するか、
export VISUAL=micro;
を追加することで、デフォルトのエディターを変更できます。
~/.bashrc
(または同等のシェル) にコピーします。
デフォルトでは、crontab は空白である可能性が高いため、手動でジョブを追加する必要があります。 cron ジョブは通常、次のような形式になります。
分 時 日 月 平日 <実行コマンド>
実行するコマンドはシェル スクリプトなど何でもかまいません
各時間変数の値はワイルドカードにすることができ、cron は常に true として解釈します。たとえば、毎日、毎時 15 分後にジョブを実行したい場合は、次のように使用します。
15 * * * * コマンド
これは、曜日に関係なく、毎日、毎月、毎時 15 分に実行されます。
毎週金曜日の午後 5 時 30 分にジョブを実行したい場合は、以下を使用します。
30 17 * * 5 コマンド
cron
、範囲指定された値と段階的な値もサポートします。範囲値には、特定の範囲内のすべての値が含まれます。作業中に 1 時間ごとにジョブを実行したい場合は、以下を使用します。
0 9-17 * * 1-5 コマンド
月曜日から金曜日の午前 9 時から午後 5 時まで。同様に、値をカンマで区切って値のリストを定義できます。
ステップ値は、より具体的な間隔で実行されます。以下を使用して、2 時間ごとにジョブを実行できます。
0 */2 * * * コマンド
時計は真夜中の 00:00 から始まることに注意してください。ジョブは 1 回実行され、次に午前 2 時に実行され、次に午前 4 時に実行されます。
cron
の一部のバージョンでは、1 日 1 回実行する
@daily
や再起動のたびに実行する
@reboot
など、より多くの構文がサポートされていますが、ディストリビューションは異なる場合があります。
cron
構文を簡単にデバッグする方法が必要な場合は、
crontab.guru
などの多くのオンライン エディターがあり、スケジュール式の意味をわかりやすく表示します。つまり、「
2 時間ごとの 0 分」です。
Cron が動作していることを確認する
Cron は、ジョブを実行していることを示すものは表示しません。機能しているかどうかを知りたい場合は、出力を手動でリダイレクトする必要があります。これを行うには、出力をログ ファイルにパイプ処理します。
* * * * * echo "テスト" >> ログファイル 2>&1
>>
演算子は出力をファイルに追加し、
2>&1
演算子は出力に stderr を確実に含めます。 bash に相当するものは、
>>
の代わりに
&>>
になりますが、 cron はデフォルトで
/bin/sh
を使用するため、すべてのディストリビューションで機能するとは限りません。
Cron は、ジョブの出力を電子メールで送信するように構成できます。実際には、デフォルトでユーザー アカウントのデフォルトの電子メール アドレスを使用してこれが行われますが、正しく構成されていない可能性があります。電子メールを機能させるには、サーバー上でメール エージェントをセットアップおよび構成する必要があります。これにより、
mail
コマンドを使用して電子メールを送信できるようになります。次に、cron ジョブの cron ジョブの上に次の行を配置します。
MAILTO="あなたの名前@gmail.com"
これで、stdout に送られるジョブからの出力 (たとえば、どこかにパイプされない) は、指定したアドレスに
mail
で送信されます。これをテストするには、毎分標準出力にエコーする一時ジョブを追加します。
* * * * * echo "cron メールは機能しています!"
ジョブが動作したら必ずオフにするようにしてください。そうしないと、すぐに煩わしくなります。
Cron はデフォルトで Bash ではなく /bin/sh を使用します
cron
ジョブを実行するシェルとは異なるシェルを使用している可能性があります。 Bash (
/bin/bash
) は、ほとんどのディストリビューションで共通のシェルであり、sh の実装です。
/bin/sh
ファイルは
sh
実装へのシンボリックリンク
ですが、必ずしも bash であるとは限りません。 Ubuntu などの Debian ベースのシステムおよび macOS では、
/bin/sh
デフォルトで
dash
にリンクします。
この混乱の結果、スクリプトが同じように実行されなくなり、PATH 変数 (とりわけ) が正しく構成されなくなる可能性があります。これはいくつかの方法で回避できますが、ディストリビューションの
cron
のバージョンの動作が異なる場合があるため、いくつか試してみることが必要になる場合があります。
-
SHELL=/bin/bashを crontab の先頭に追加します。 bash プロファイルを読み取るためにBASH_ENV="/root/.bashrc"を追加する必要がある場合もあります。 -
各ジョブのコマンドの前に
/bin/bashを置きます。グローバルに bash に切り替えない場合でも、BASH_ENV変数の設定が必要になる場合があります。 -
各スクリプトの先頭で bash シバン
#!/bin/bashを使用します。そのためには、各ジョブを独自のスクリプト ファイルに含める必要があります。
いずれの場合も、cron ジョブが信頼できると判断する前に、数分前に実行されるように設定して cron ジョブをデバッグする必要があります。
Crontab を手動で更新する
crontab -e
を使用して crontab を管理したくない場合は、より良い方法があります。コマンド
crontab -l
crontab の内容を表示し、これをファイルにパイプ出力できます。
crontab -l > my_crontab
次に、そのファイルを別のシステムにアップロードし、次のように「インストール」します。
crontab my_crontab
こうすることで、
cron
を介して読み込まれるため、直接編集してもエラーは発生しません。





