cronは、指定された間隔でcronジョブを実行するスケジューリングデーモンです。 cronジョブは、システムメンテナンス、データベースまたはデータのバックアップ、システムアップデート、ディスクスペース使用量の確認、電子メールの送信などの反復または管理タスクを自動化します。
cronジョブを、分、時間、曜日、曜日、月、またはこれらの任意の組み合わせで実行するようにスケジュールできます。
なぜCronなのですか?
- cronを使用すると、ジョブまたはタスクをいつ実行するかを制御できます。たとえば、実行の分、時間、日などを制御できます。
- cronジョブは実行されていないときにメモリを占有しません。
- タスクのループコードやロジックコードを作成する必要がなくなります。
- 何らかの理由でジョブの実行に失敗した場合、次の時間間隔でジョブが再度実行されます。
cronデーモンをインストールして実行します
Linuxのcronユーティリティは、cronサービスを提供するcronieパッケージとともにインストールされます。
cronieパッケージがインストールされているかどうかを確認してください。
[tuts @ fosslinux〜] $ rpm -q croniecronie-1.5.7-1.fc33.x86_64
cronieパッケージが存在しない場合は、Fedoraユーザー向けに次のコマンドを使用してインストールしてください。
[tuts @ fosslinux〜] $ sudo dnf install cronie
タスクをスケジュールする前に、crond(cronデーモン)サービスを開始する必要があります。
crondサービスが実行されているかどうかを確認してください。
[tuts @ fosslinux〜] $ systemctl status crond.service●crond.service-コマンドSchedulerLoaded:ロード済み(/usr/lib/systemd/system/crond.service;有効;ベンダーpre> アクティブ:アクティブ(実行中) 火2021-06-0809:14:40EAT; 2時間58分前メインPID:1671(crond)タスク:1(制限:3448)メモリ:14.4MCPU:316msCGroup:/system.slice/crond.service└─1671/ usr / sbin / crond -n
コマンドが(アクティブ:アクティブ(実行中)を示している場合、サービスは実行中です。crondサービスが実行されていない場合は、次のコマンドを使用して現在のセッションでサービスを開始します。
[tuts @ fosslinux〜] $ systemctl start crond.service
次のコマンドを使用して、起動時に自動的に開始および実行されるようにサービスを構成することもできます。
[tuts @ fosslinux〜] $ systemctl enable crond.service
stopコマンドを使用してcrondサービスの実行を停止できます。
[tuts @ fosslinux〜] $ systemctl stop crond.service
再起動コマンドを使用して再起動することもできます:
[tuts @ fosslinux〜] $ systemctl restart crond.service
cronジョブを定義する
cronジョブがどのように機能するかを理解するために、cronジョブの例とcrontab構成ファイルを構成する部分を見ていきます。
例:gitマスターブランチの最新の変更をプルするcronジョブ。
* / 55 * * * * username cd / home / username / project / shop_app &&git pull origin master
上記のcronジョブは、次の2つの主要部分で構成されています。
- 最初の部分(* / 55 * * * *)は、55分ごとに実行するようにタイマーを設定します。
- cronジョブ構成の2番目の部分では、コマンドラインから実行されるステートメントを定義します。コマンドはユーザー(username)として実行され、ディレクトリを(/ home / username / project / shop_app)に変更します。最後の部分では、gitコマンドを実行して、プロジェクトのマスターブランチの最新の変更をプルします。
crontabを使用してcronジョブを作成する
目安として、cronファイルを直接編集することは想定されていません。代わりに、crontabコマンドを使用して、システムで実行されているcronジョブを作成、編集、インストール、アンインストール、または一覧表示します。 cronジョブを定義すると、それらはバックグラウンドで実行され、デーモンは/ etc / crontabファイル、/ etc /cron。*/、および/ var / spool /cron/ディレクトリで新しいcronジョブを常にチェックします。
FedoraなどのRedHatベースのディストリビューションはcrontabファイルを/var/ spool / cronディレクトリに保存し、DebianおよびUbuntuディストリビューションは/ var / spool / cron/crontabsディレクトリに保存します。システム全体のcrontabファイルとスクリプトは、それぞれetc/crontabファイルと/etc/cron.dディレクトリに保存されます。
新しい構成ファイルを作成した後、または既存の構成ファイルを編集した後は、cronを再起動する必要がないことに注意してください。
crontab時間の構文と演算子
cronジョブ定義の最初の部分は、タイミング情報です。 cronジョブがいつどのくらいの頻度で実行されるかを決定します。分、時、日、月、曜日の順で構成されます。カンマまたはハイフンで区切って1つ以上の値を指定できます。
.----------------分(0-59)| .-------------時間(0-23)| | .----------月の日(1〜31)| | | .-------月(1〜12)またはjan、feb、mar、apr…| | | | .----曜日(0-6)(Sunday =0または7)またはsun、mon、tue、wed、thr、fri、sat | | | | | | | | | | * * ***実行するusernamecronjobコマンド
- * –実行時間を定義するときに、値の代わりにアスタリスクを使用して、その位置で可能なすべての値を表すことができます。たとえば、分の位置にアスタリスクを使用すると、cronジョブは1分ごとに実行されます。
- –コンマは、繰り返しの値のリストを指定します。たとえば、[時間]フィールドに2、3、6を指定すると、cronジョブは午前2時、午前3時、および午前6時に実行されます。
- – –ハイフンは値の範囲を指定します。たとえば、曜日フィールドに2〜6がある場合、cronジョブは火曜日から土曜日まで毎週実行されます。
- / –スラッシュ演算子は、特定の間隔で繰り返される値を指定します。たとえば、時間フィールドの* / 6は、cronジョブが6時間ごとに実行されることを示します。これは、0、6、12、18を指定するのと似ています。
事前定義されたマクロ
Cronには、一般的な間隔を指定するために使用できるいくつかの特別なスケジュールマクロがあります。日付と時刻の指定の代わりに使用できます。
- @reboot –指定されたタスクはシステムの起動時に実行されます。
- @yearlyまたは@annually–指定されたタスクは、1月1日の深夜に年に1回実行されます。 0 0 11*に似ています。
- @monthly –タスクは月に1回、月の初日の深夜に実行されます。 0 0 1**に似ています。
- @weekly-指定されたタスクは、週に1回、日曜日の深夜に実行されます。 0 0 **0と同等です。
- @daily –指定されたタスクは1日1回深夜に実行されます。 0 0 ***と同等です。
- @hourly –タスクは1時間の初めに1時間に1回実行されます。 0 * ***に似ています。
Crontabコマンド
crontabコマンドを使用すると、crontabファイルをインストール、開く、または表示できます。
次のコマンドを使用して、crontabファイルを作成するか、既存のファイルを開きます。
$ crontab -e
このコマンドはデフォルトでviエディターを開き、システムで実行するcronジョブを定義できるようにします。
システム内のすべてのcronジョブを一覧表示し、crontabファイルの内容を表示します:
$ crontab -l </ pre>-uオプションを使用して、特定のユーザーのcronジョブを一覧表示します。
$ crontab -u username -l </ pre>-rコマンドを使用してすべてのcronジョブを削除します:
$ crontab -rrootユーザーとして-r-uコマンドを使用して、特定のユーザーのcronジョブを削除します。
$ crontab -r -u username削除する前に、プロンプトを表示して現在のcrontabファイルを削除します。
$ crontab -icrontab変数
- PATH =/ usr / bin:/binがデフォルトのcrontabパスです。ただし、実行しているコマンドへのパスを定義したり、cron$PATH変数を変更したりできます。
- bin/shがデフォルトのシェルです。
- MAILTO環境は、電子メール通知を送信するcrontabの所有者を定義します。電子メール通知を受信するために、すべての電子メールアドレスのコンマ区切りリストを変数に追加できます。 MAILTO変数が空の場合(つまり、MAILTO =”“)、メールは送信されないことに注意してください。
cronジョブの例
次のcronジョブが毎分実行されます:
* * * **[cronジョブコマンド]
次のcronジョブは、1時間に6回、つまり10分ごとに実行されます。
* / 10 * * **[cronジョブコマンド]
30分ごとにスクリプトを実行し、出力を「/ home / tuts / Documents」にリダイレクトします:
MAILTO [email protected] * / 30 * * * * /path/to/homescript.sh> / home / username / Documents
&&演算子を使用して、毎週金曜日の午前8時に2つのコマンドを実行します。
0 8 * * Fri commandA &&commandB
月に1回、月の5日目の午前2:00にコマンドを実行します:
(つまり、3月5日午前2:00、4月5日午前2:00、12月5日午前2:00、e.t.c):
0 2 5 **[cronジョブコマンド]
毎月3日と23日の午前10時30分にスクリプトを実行します。
30 10 3,23 * * /path/to/fosslinuxscript.sh
次のコマンドを使用して、カスタムHOME、PATH、SHELL、およびMAILTO変数を設定し、1分ごとにコマンドを実行します。
HOME =/ optPATH =/ usr / local / sbin:/ usr / local / bin:/ usr / sbin:/ usr / bin:/ sbin:/binSHELL=/usr/bin/[email protected] * / 1 * * **[cronジョブコマンド]
スケジュールのヒント
cronジョブをスケジュールするタスクは、ジョブの数が増えるにつれて困難で困難な場合があります。特に実稼働環境で同時に実行されるcronジョブは、深刻なパフォーマンスの問題を引き起こす可能性があります。たとえば、同時に実行されるシステムのバックアップとコンパイルは多くのシステムリソースを消費し、システムのRAMが不足する可能性があります。このような課題を回避する1つの方法は、リソースを大量に消費するタスクを1日、1週間、または1か月のさまざまな時間にスケジュールすることです。また、システムにメモリを追加したり、大量のメモリを使用する不適切に記述されたタスクを削除したりすることもできます。
cronジョブの実行がスケジュールされている期間中にコンピュータの電源がオフになると、別の問題が発生します。その結果、cronジョブは、次に実行がスケジュールされるまで実行されません。これは、特にcronジョブがシステムにとって重要である場合に、問題を引き起こす可能性があります。幸い、Linuxにはanacronプログラムが用意されており、ユーザーはcronジョブを定期的にスケジュールすることができます。 anacronのmanページから詳細をご覧ください。
cronアクセスの制限
Cronは、どの通常のシステムユーザーがcrontabコマンドにアクセスできるかを制御する方法を提供します。これは、メモリなどのシステムリソースがいっぱいになる可能性のあるミスを制限するのに役立ちます。誤用を防ぐために、/ etc/cron.denyファイルと/etc/cron.allowファイルを使用してユーザーアクセスを制御してください。いずれかのファイルにユーザー名を追加して、アクセスを拒否または許可できます。
root以外のユーザーによるcronジョブとcrontabコマンドへのアクセスを制限することが重要です。
結論
Cronは主にシステム管理者向けのツールですが、多くのユーザータスクにも関連しています。たとえば、cronを使用して、バックアップやWebアプリケーションなどの退屈なタスクをスケジュールします。
cron、crontab、およびanacronのマニュアルページは、情報とヒントが役立ち、有益であると思います。