システム管理者になることの(多くの利点の中で)課題の1つは、眠りたいときにタスクを実行することです。たとえば、一部のタスク(定期的に繰り返されるタスクを含む)は、コンピュータリソースを使用する予定がない場合、夜間または週末に実行する必要があります。夕方には、営業時間外に動作する必要のあるコマンドやスクリプトを実行する時間がありません。そして、バックアップやメジャーアップデートを開始するために、何百人もの人に立ち上がる必要はありません。
代わりに、2つのサービスユーティリティを使用して、コマンド、プログラム、およびタスクを所定の時間に実行できるようにします。 cron およびat サービスを使用すると、システム管理者はタスクを将来の特定の時間に実行するようにスケジュールできます。 atサービスは、特定の時間に実行される1回限りのタスクを指定します。 cronサービスは、毎日、毎週、毎月など、繰り返しタスクをスケジュールできます。
この記事では、cronサービスとその使用方法を紹介します。
一般的な(および一般的でない)cronの使用
cronを使用しています 毎日午前2時に行われる定期的なバックアップなど、明らかなことをスケジュールするサービス。あまり明白でないことにも使用します。
- 多くのコンピューターのシステム時間(つまり、オペレーティングシステム時間)は、ネットワークタイムプロトコル(NTP)を使用して設定されます。 NTPはシステム時刻を設定しますが、ドリフトする可能性のあるハードウェア時刻は設定しません。 cronを使用して、システム時間に基づいてハードウェア時間を設定します。
- また、毎朝早く実行するBashプログラムがあり、各コンピューターに新しい「今日のメッセージ」(MOTD)を作成します。ディスク使用量など、役立つために最新である必要がある情報が含まれています。
- Logwatch、logrotate、Rootkit Hunterなどの多くのシステムプロセスとサービスは、cronサービスを使用してタスクをスケジュールし、プログラムを毎日実行します。
crond デーモンは、cron機能を有効にするバックグラウンドサービスです。
cronサービスは、 / var / spool / cron内のファイルをチェックします および/etc/cron.d ディレクトリと/etc / anacrontab ファイル。これらのファイルの内容は、さまざまな間隔で実行されるcronジョブを定義します。個々のユーザーのcronファイルは/var / spool / cronにあります。 、およびシステムサービスとアプリケーションは通常、 /etc/cron.dにcronジョブファイルを追加します ディレクトリ。 / etc / anacrontab は、この記事の後半で説明する特殊なケースです。
crontabの使用
cronユーティリティは、cronテーブル( crontab )で指定されたコマンドに基づいて実行されます )。 rootを含む各ユーザーは、cronファイルを持つことができます。これらのファイルはデフォルトでは存在しませんが、 / var / spool / cronに作成できます。 crontab -eを使用したディレクトリ cronファイルの編集にも使用されるコマンド(以下のスクリプトを参照)。 しないことを強くお勧めします 標準のエディター(Vi、Vim、Emacs、Nano、または利用可能な他の多くのエディターのいずれかなど)を使用します。 crontabの使用 コマンドを使用すると、コマンドを編集できるだけでなく、 crondを再起動することもできます。 エディターを保存して終了するときのデーモン。 crontab コマンドは、Viが常に存在するため(最も基本的なインストールでも)、基盤となるエディターとしてViを使用します。
新しいcronファイルは空であるため、コマンドを最初から追加する必要があります。クイックリファレンスとして、以下のジョブ定義の例を自分のcronファイルに追加したので、コマンドのさまざまな部分の意味がわかります。自由にコピーして自分で使用してください。
# crontab -e
SHELL=/bin/bash
[email protected]
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
# For details see man 4 crontabs
# 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
# backup using the rsbu program to the internal 4TB HDD and then 4TB external
01 01 * * * /usr/local/bin/rsbu -vbd1 ; /usr/local/bin/rsbu -vbd2
# Set the hardware clock to keep it in sync with the more accurate system clock
03 05 * * * /sbin/hwclock --systohc
# Perform monthly updates on the first of the month
# 25 04 1 * * /usr/bin/dnf -y update
上記のコードの最初の3行は、デフォルトの環境を設定しています。 cronはいかなる種類の環境も提供しないため、環境は特定のユーザーに必要なものに設定する必要があります。 シェル 変数は、コマンドの実行時に使用するシェルを指定します。この例では、Bashシェルを指定します。 MAILTO 変数は、cronジョブの結果が送信される電子メールアドレスを設定します。これらの電子メールは、cronジョブのステータス(バックアップ、更新など)を提供し、コマンドラインからプログラムを手動で実行した場合に表示される出力で構成されます。 3行目は、パスを設定します 環境のために。ここでパスを設定しますが、各実行可能ファイルには常に完全修飾パスを付加します。
上記の例には、cronジョブを定義するために必要な構文を詳しく説明するコメント行がいくつかあります。これらのコマンドを分解してから、さらにいくつか追加して、crontabファイルのより高度な機能を紹介します。
01 01 * * * /usr/local/bin/rsbu -vbd1 ; /usr/local/bin/rsbu -vbd2
この行は、自分で作成したBashシェルスクリプト rsbuを実行します。 、これですべてのシステムがバックアップされます。この仕事は毎日午前1時1分(01 01)に始まります。時間指定の3、4、および5の位置にあるアスタリスク(*)は、他の時間区分のファイルグロブまたはワイルドカードのようなものです。 「毎月」、「毎月」、「毎日」を指定します。この行はバックアップを2回実行します。 1つは内蔵の専用バックアップハードドライブにバックアップし、もう1つは貸金庫に持っていくことができる外付けのUSBドライブにバックアップします。
次の行は、正確な時刻のソースとしてシステムクロックを使用して、コンピューターのハードウェアクロックを設定します。この回線は、毎日午前5時3分(03 05)に実行されるように設定されています。
03 05 * * * /sbin/hwclock --systohc
dnf を実行するために、3番目で最後のcronジョブ(コメントアウト)を使用していました またはyum 毎月1日の午前4時25分に更新されますが、コメントアウトしたため、実行されなくなりました。
# 25 04 1 * * /usr/bin/dnf -y update
その他のスケジューリングのコツ
それでは、これらの基本よりも少し面白いことをいくつかやってみましょう。毎週木曜日の午後3時に特定のジョブを実行するとします。
00 15 * * Thu /usr/local/bin/mycronjob.sh
または、各四半期の終了後に四半期レポートを実行する必要があるかもしれません。 cronサービスには「月末日」のオプションがないため、以下に示すように、代わりに翌月の初日を使用できます。 (これは、ジョブの実行が設定されたときに、レポートに必要なデータの準備ができていることを前提としています。)
02 03 1 1,4,7,10 * /usr/local/bin/reports.sh
以下は、午前9時1分から午後5時1分までの1時間ごとに1分過ぎて実行されるジョブを示しています。
01 09-17 * * * /usr/local/bin/hourlyreminder.sh
2、3、または4時間ごとにジョブを実行する必要がある状況に遭遇しました。これは、時間を * / 3などの目的の間隔で割ることで実現できます。 3時間ごと、または 6-18 / 3 午前6時から午後6時まで3時間ごとに実行します。他の間隔も同様に分割できます。たとえば、式 * / 15 分の位置にあるということは、「15分ごとにジョブを実行する」ことを意味します。
*/5 08-18/2 * * * /usr/local/bin/mycronjob.sh
注意すべき1つのこと:除算式は、ジョブを実行するために余りがゼロになる必要があります。そのため、この例では、ジョブは午前8時から午後6時までの偶数時間に5分ごと(08:05、08:10、08:15など)に実行されるように設定されていますが、奇数時間には実行されません。番号付き時間。たとえば、ジョブは午後9時からまったく実行されません。午前9時59分まで
これらの例に基づいて、他にも多くの可能性を考え出すことができると確信しています。
cronアクセスの制限
その他のLinuxリソース
- Linuxコマンドのチートシート
- 高度なLinuxコマンドのチートシート
- 無料のオンラインコース:RHELの技術概要
- Linuxネットワーキングのチートシート
- SELinuxチートシート
- Linuxの一般的なコマンドのチートシート
- Linuxコンテナとは何ですか?
- 最新のLinux記事
cronアクセスを持つ通常のユーザーは、たとえば、システムリソース(メモリやCPU時間など)がいっぱいになる可能性があるという間違いを犯す可能性があります。誤用の可能性を防ぐために、システム管理者は /etc/cron.allow を作成して、ユーザーアクセスを制限できます。 cronジョブを作成する権限を持つすべてのユーザーのリストを含むファイル。 rootユーザーがcronを使用するのを防ぐことはできません。
root以外のユーザーが独自のcronジョブを作成できないようにすることで、rootが自分のcronジョブをrootcrontabに追加する必要がある場合があります。 "ちょっと待って!"あなたは言う。 「それはそれらのジョブをrootとして実行しませんか?」必ずしも。この記事の最初の例では、コメントに示されているユーザー名フィールドを使用して、ジョブの実行時にジョブが持つユーザーIDを指定できます。これにより、指定された非rootユーザーのジョブがrootとして実行されなくなります。次の例は、ユーザー「学生」としてジョブを実行するジョブ定義を示しています。
04 07 * * * student /usr/local/bin/mycronjob.sh
ユーザーが指定されていない場合、ジョブはcrontabファイル(この場合はroot)を所有するユーザーとして実行されます。
cron.d
ディレクトリ/etc/cron.d SpamAssassinやsysstatなどの一部のアプリケーションがcronファイルをインストールする場所です。 spamassassinまたはsysstatユーザーがいないため、これらのプログラムにはcronファイルを見つける場所が必要です。そのため、これらのプログラムは /etc/cron.dに配置されます。 。
/etc/cron.d/sysstat 以下のファイルには、システムアクティビティレポート(SAR)に関連するcronジョブが含まれています。これらのcronファイルは、ユーザーcronファイルと同じ形式です。
# Run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib64/sa/sa1 1 1
# Generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A
sysstat cronファイルには、タスクを実行する2行があります。最初の行はsa1を実行します / var / log / saの特別なバイナリファイルに保存されているデータを収集するように10分ごとにプログラムします ディレクトリ。次に、毎晩23:53に、 sa2 プログラムを実行して、毎日の要約を作成します。
スケジュールのヒント
crontabファイルで設定した時間の中には、かなりランダムに見えるものもありますが、ある程度はランダムです。 cronジョブをスケジュールしようとすると、特にジョブの数が増えるにつれて、困難になる可能性があります。私は通常、各コンピューターでスケジュールするタスクがわずかしかありません。これは、私が働いていた本番環境やラボ環境の一部よりも簡単です。
私が管理した1つのシステムには、毎晩実行される約12のcronジョブと、週末または月の最初に実行される追加の3つまたは4つのcronジョブがありました。同時に実行されたジョブが多すぎる場合(特にバックアップとコンパイル)、システムがRAMを使い果たし、スワップファイルがほぼいっぱいになり、パフォーマンスが低下している間にシステムがスラッシングしたため、何も実行されなかったため、これは課題でした。メモリを追加し、タスクのスケジュール方法を改善しました。また、書き込みが非常に不十分で、大量のメモリを使用しているタスクも削除しました。
crondサービスは、ホストコンピューターが常に実行されていることを前提としています。つまり、cronジョブの実行がスケジュールされている期間中にコンピューターの電源がオフになっていると、次にスケジュールされるまで実行されません。重要なcronジョブである場合、これにより問題が発生する可能性があります。幸い、定期的にジョブを実行するための別のオプションがあります: anacron 。
anacron
anacronプログラムは、crondと同じ機能を実行しますが、コンピューターの電源が切れているか、1サイクル以上ジョブを実行できない場合など、スキップされたジョブを実行する機能を追加します。これは、電源がオフになっている、またはスリープモードになっているラップトップやその他のコンピューターに非常に役立ちます。
コンピューターの電源を入れて起動するとすぐに、anacronは、構成されたジョブが最後にスケジュールされた実行を逃したかどうかを確認します。ある場合、それらのジョブはすぐに実行されますが、1回だけ実行されます(サイクルがいくつ失われたとしても)。たとえば、休暇中にシステムがシャットダウンされたために毎週のジョブが3週間実行されなかった場合、コンピュータの電源を入れた直後に実行されますが、3回ではなく1回だけ実行されます。
anacronプログラムは、定期的にスケジュールされたタスクを実行するためのいくつかの簡単なオプションを提供します。スクリプトを/etc/cronにインストールするだけです。[毎時|毎日|毎週|毎月] ディレクトリ、実行する必要のある頻度によって異なります。
これはどのように作動しますか?シーケンスは最初に表示されるよりも単純です。
- crondサービスは、 /etc/cron.d/0hourlyで指定されたcronジョブを実行します 。
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly
- /etc/cron.d/0hourlyで指定されたcronジョブ run-partsを実行します 1時間に1回プログラムします。
- 実行パーツ プログラムは、 /etc/cron.hourlyにあるすべてのスクリプトを実行します ディレクトリ。
- /etc/cron.hourly ディレクトリには0anacronが含まれています / etdc / anacrontabを使用してanacronプログラムを実行するスクリプト ここに示されている構成ファイル。
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
- anacronプログラムは、 /etc/cron.dailyにあるプログラムを実行します 1日1回; /etc/cron.weeklyにあるジョブを実行します 週に1回、 cron.monthlyのジョブ 月に1回。これらのジョブが自分自身や他のcronジョブと重複しないようにするために、各行に指定されている遅延時間をメモしてください。
完全なBashプログラムをcron.Xに配置する代わりに ディレクトリについては、 / usr / local / binにインストールします ディレクトリ。コマンドラインから簡単に実行できます。次に、 /etc/cron.dailyなどの適切なcronディレクトリにシンボリックリンクを追加します。 。
anacronプログラムは、特定の時間にプログラムを実行するようには設計されていません。むしろ、午前3時など、指定された時間に開始する間隔でプログラムを実行することを目的としています( START_HOURS_RANGE を参照)。 毎日、日曜日(週を開始するため)、および月の最初の日の(すぐ上のスクリプトの行)。 1つ以上のサイクルが失われた場合、anacronは失われたジョブをできるだけ早く1回実行します。
ショートカット
/ etc / anacrontab 上に示したファイルは、いくつかの特定の一般的な時間にショートカットを使用する方法の手がかりを示しています。これらの単一単語の時間ショートカットは、時間を指定するために通常使用される5つのフィールドを置き換えるために使用できます。 @ 文字は、cronへのショートカットを識別するために使用されます。以下のリストは、crontab(5)のマニュアルページから抜粋したもので、同等の意味を持つショートカットを示しています。
- @reboot:再起動後に1回実行します。
- @yearly:年に1回実行します。 0 0 1 1 *
- @annually:年に1回実行します。 0 0 1 1 *
- @monthly:月に1回実行します。 0 0 1 * *
- @weekly:週に1回実行します。 0 0 * * 0
- @daily:1日1回実行します。 0 0 * * *
- @hourly:1時間に1回実行します。 0 * * * *
これらのショートカットは、 /etc/cron.dなどの任意のcrontabファイルで使用できます。 。
制限の設定の詳細
私はこれらの方法のほとんどを、自分のコンピューターで実行するタスクをスケジュールするために使用しています。これらのタスクはすべて、root権限で実行する必要があるタスクです。私の経験では、通常のユーザーが実際にcronジョブを必要とすることはめったにありません。 1つのケースは、開発ラボで毎日のコンパイルを開始するためにcronジョブが必要な開発者ユーザーでした。
root以外のユーザーによるcron関数へのアクセスを制限することが重要です。ただし、ユーザーが事前に指定された時間に実行するようにタスクを設定する必要がある場合があり、cronはそれを許可することができます。多くのユーザーは、cronを使用してこれらのタスクを適切に構成する方法を理解しておらず、間違いを犯しています。これらの間違いは無害かもしれませんが、多くの場合、問題を引き起こす可能性があります。ユーザーがsysadminと対話するようにする機能ポリシーを設定することにより、個々のcronジョブが他のユーザーや他のシステム機能に干渉する可能性がはるかに低くなります。
個々のユーザーまたはグループに割り当てることができる合計リソースに制限を設定することは可能ですが、それはまた別の記事です。
詳細については、cron、crontab、anacron、anacrontab、およびrun-partsのマニュアルページに、cronシステムの動作に関する優れた情報と説明があります。
この記事は元々2017年11月に公開され、追加情報を含むように更新されました。