GNU/Linux >> Linux の 問題 >  >> Linux

cronとAtによるスケジューリング

はじめに

システム管理者になることの(多くの利点の中で)課題の1つは、眠りたいときにタスクを実行することです。たとえば、一部のタスク(定期的に繰り返されるタスクを含む)は、コンピューターリソースを使用する予定がない場合、夜間または週末に実行する必要があります。夕方には、営業時間外に動作する必要のあるコマンドやスクリプトを実行する時間がありません。そして、バックアップやメジャーアップデートを開始するために、何百人もの人に立ち上がる必要はありません。

代わりに、2つのサービスユーティリティを使用して、コマンド、プログラム、およびタスクを所定の時間に実行できるようにします。 cron およびat サービスを使用すると、システム管理者はタスクを将来の特定の時間に実行するようにスケジュールできます。 atサービスは、特定の時間に実行される1回限りのタスクを指定します。 cronサービスは、毎日、毎週、毎月など、繰り返しタスクをスケジュールできます。

1。 cron

cron は、Linuxのようなオペレーティングシステムによって提供されるソフトウェアユーティリティであり、スケジュールされたタスクを所定の時間に自動化します。これはデーモンプロセスです 、バックグラウンドプロセスとして実行され、ユーザーの介入なしに特定のイベントまたは条件がトリガーされたときに、事前定義された時間に指定された操作を実行します。繰り返されるタスクを頻繁に処理することは、システム管理者にとって威圧的なタスクです。したがって、システム管理者は、 cron を使用してこれらのコマンドのリストを作成することにより、このようなプロセスをバックグラウンドで定期的に自動的に実行するようにスケジュールできます。 。

これにより、ユーザーは、毎日深夜にバックアップを実行したり、毎週更新をスケジュールしたり、一定の間隔でファイルを同期したりするように、スケジュールされたタスクを目立たないように定期的に実行できます。 Cronはスケジュールされたジョブを繰り返しチェックし、スケジュールされた時間フィールドが現在の時間フィールドと一致すると、スケジュールされたコマンドが実行されます。マルチユーザーの実行レベルに入ると、/ etc/init.dから自動的に開始されます。

一般的な(および一般的でない)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 は、この記事の後半で説明する特殊なケースです。

Linuxでcronを使用する方法

コマンドの時間がありませんか? cronを使用してタスクをスケジュールすると、プログラムは実行できますが、遅くまで起きている必要はありません。

crontabの使用

cronユーティリティは、cronテーブル( crontab )で指定されたコマンドに基づいて実行されます )。 rootを含む各ユーザーは、cronファイルを持つことができます。これらのファイルはデフォルトでは存在しませんが、 / var / spool / cronに作成できます。 crontab -eを使用したディレクトリ cronファイルの編集にも使用されるコマンド(以下のスクリプトを参照)。 しないことを強くお勧めします 標準のエディター(Vi、Vim、Emacs、Nano、または利用可能な他の多くのエディターのいずれかなど)を使用します。

Crontab

crontabの使用 コマンドを使用すると、コマンドを編集できるだけでなく、 crondを再起動することもできます。 エディターを保存して終了するときのデーモン。 crontab コマンドは、Viが常に存在するため(最も基本的なインストールでも)、基盤となるエディターとしてViを使用します。

新しいcronファイルは空であるため、コマンドを最初から追加する必要があります。クイックリファレンスとして、以下のジョブ定義の例を自分のcronファイルに追加したので、コマンドのさまざまな部分の意味がわかります。自由にコピーして自分で使用してください。

crontab -e

The

上記のコードの最初の3行は、デフォルトの環境を設定しています。 cronはいかなる種類の環境も提供しないため、環境は特定のユーザーに必要なものに設定する必要があります。 シェル 変数は、コマンドの実行時に使用するシェルを指定します。この例では、Bashシェルを指定します。 MAILTO 変数は、cronジョブの結果が送信される電子メールアドレスを設定します。これらの電子メールは、cronジョブのステータス(バックアップ、更新など)を提供し、コマンドラインからプログラムを手動で実行した場合に表示される出力で構成されます。 3行目は、パスを設定します 環境のために。ここでパスを設定しますが、各実行可能ファイルには常に完全修飾パスを付加します。

上記の例には、cronジョブを定義するために必要な構文を詳しく説明するコメント行がいくつかあります。これらのコマンドを分解してから、さらにいくつか追加して、crontabファイルのより高度な機能を紹介します。

01 01 * * * /usr/local/bin/rsbu -vbd1 ; /usr/local/bin/rsbu -vbd2

これ

lineは、自分で作成した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/* * * /usr/local/bin/mycronjob.sh

注意事項 :ジョブを実行するには、除算式の余りがゼロである必要があります。そのため、この例では、ジョブは午前8時から午後6時までの偶数時間に5分ごと(08:05、08:10、08:15など)に実行されるように設定されていますが、奇数時間には実行されません。番号付き時間。たとえば、ジョブは午後9時からまったく実行されません。午前9時59分まで

これらの例に基づいて、他にも多くの可能性を考え出すことができると確信しています。

cronアクセスの制限

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にインストールするだけです。[毎時|毎日|毎週|毎月] ディレクトリ、実行する必要のある頻度によって異なります。

これはどのように作動しますか?シーケンスは最初に表示されるよりも単純です。

  1. 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

  1. /etc/cron.d/0hourlyで指定されたcronジョブ run-partsを実行します 1時間に1回プログラムします。
  2. 実行パーツ プログラムは、 /etc/cron.hourlyにあるすべてのスクリプトを実行します ディレクトリ。
  3. /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

  1. 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の構文:

cron [-f] [-l] [-L loglevel]

オプション:

  • -f: フォアグラウンドモードのままで、デーモン化しないために使用されます。
  • -l: これにより、/ etc/cron.dファイルのLSB準拠の名前が有効になります。
  • -n: メールを送信するときに件名にFQDNを追加するために使用されます。
  • -Lログレベル: このオプションは、次の値を持つジョブについて何をログに記録するかをcronに指示します。
    • 1: すべてのcronジョブの開始をログに記録します。
    • 2: すべてのcronジョブの終了をログに記録します。
    • 4: 失敗したすべてのジョブをログに記録します。ここでは、終了ステータスはゼロに等しくなりません。
    • 8: すべてのcronジョブのプロセス番号がログに記録されます。

crontab(「crontable」の略)は、特定の時間にスケジュールされたタスクを実行するためのコマンドのリストです。これにより、ユーザーはスケジュールされたタスクを追加、削除、または変更できます。 crontabコマンドの構文には、スペースで区切られた6つのフィールドがあり、最初の5つはタスクを実行する時間を表し、最後の1つはコマンド用です。

  • 分(0〜59の値を保持)
  • 時間(0〜23の値を保持)
  • 日(1〜31の値を保持)
  • その年の月(1〜12または1〜12の値を保持し、月の名前の最初の3文字が使用されます)
  • 曜日(0〜6または日〜土の値を保持します。ここでは、その日の最初の3文字も使用されます)
  • コマンド
日付と時刻のフィールドの形式を管理するルールは次のとおりです:
  • 最初の5つのフィールドのいずれかがアスタリスク(*)に設定されている場合、それはフィールドのすべての値を表します。たとえば、コマンドを毎日実行するには、週のフィールドにアスタリスク(*)を入力します。
  • 時刻と日付のフィールドでハイフン(-)で区切られた数値の範囲を使用して、フィールドのすべての値ではなく、複数の連続する値を含めることもできます。たとえば、7-10を使用して、7月から10月までコマンドを実行できます。
  • コンマ(、)演算子は、連続している場合と連続していない場合がある数値のリストを含めるために使用されます。たとえば、週のフィールドの「1、3、5」は、毎週月曜日、水曜日、金曜日にコマンドを実行することを意味します。
  • 指定された数の値をスキップするためにスラッシュ文字(/)が含まれています。たとえば、時間のフィールドの「* / 4」は「4時間ごと」を指定します。これは、0、4、8、12、16、20に相当します。
ユーザーにcronジョブの実行を許可する:
  • ファイルが存在する場合にcronジョブを実行できるようにするには、ユーザーがこのファイルにリストされている必要があります。
/etc/cron.allow
  • cron.allowファイルは存在しないが、cron.denyファイルは存在する場合、cronジョブを実行できるようにするには、このファイルにユーザーをリストしないでください。
/etc/cron.deny

注: これらのファイルのどちらも存在しない場合、スーパーユーザー(システム管理者)のみが特定のコマンドを使用できます。
サンプルコマンド:

  • /home/folder/gfg-code.sh毎時、毎日午前9時から午後6時まで。
00 09-18 * * * /home/folder/gfg-code.sh
  • / usr / local / bin / backup午後11時30分、毎週。
30 23 * * Mon, Tue, Wed, Thu, Fri /usr/local/bin/backup
  • sample-command.shを07:30、09:30、13:30、15:30に実行します。
30 07, 09, 13, 15 * * * sample-command.sh

cronを使用する場合は、次の点に注意する必要があります。

  • cron式への変更を追跡および維持するためのソースバージョン管理を用意します。
  • 重要度または頻度に基づいてスケジュールされたジョブを整理し、アクションまたは時間範囲ごとにグループ化します。
  • 最初に高い頻度でスケジュールされたジョブをテストします。
  • 複雑なコードや複数の配管やリダイレクトをcron式に直接記述しないでください。代わりに、それらをスクリプトに記述し、スクリプトをcronタブにスケジュールします。
  • 同じコマンドセットが頻繁に繰り返される場合は、エイリアスを使用します。
  • rootユーザーとしてcronを介してコマンドやスクリプトを実行することは避けてください。

2。で

コマンドで は、将来の特定の時間に実行されるコマンドをスケジュールするために使用されるコマンドラインユーティリティです。 コマンドで作成されたジョブ 一度だけ実行されます。 atコマンド 将来いつでも、任意のプログラムまたはメールを実行するために使用できます。特定の時刻にコマンドを実行し、HH:MM形式の時刻を受け入れて、特定の時刻にジョブを実行します。正午、真夜中、ティータイム、明日、来週、来週の月曜日などの次の表現は、コマンドで使用できます。 仕事をスケジュールします。

構文:

at [OPTION...] runtime

atコマンドのインストール

Ubuntu / Debianの場合:

sudo apt-get update
sudo apt-get install at

CentOS / Fedoraの場合:

sudo yum install at

コマンドでの操作

1。 ユーザーの保留中のジョブを一覧表示するコマンド:

at -l

または

atq

2。 来週の月曜日に、現在の時刻より20分遅れてジョブをスケジュールします。

at Monday +20 minutes

3。 2020年8月12日1:45に実行するジョブをスケジュールします:

at 1:45 081220

4。 今から4日後の午後3時に実行するジョブをスケジュールします。

at 3pm + 4 days

5。 今日の4時30分にシステムをシャットダウンするジョブをスケジュールします:

# echo "shutdown -h now" | at -m 4:30

6。 今から5時間後に実行するジョブをスケジュールします:

at now +5 hours

7。 at -rまたはatrmコマンドは、ジョブを削除するために使用されます。ここでは、ジョブ11を削除するために使用されます。

 at -r 11

または

atrm 11

Linux
  1. Linuxcronコマンドを使用したタスクのスケジューリング

  2. Linuxを初めて使用する場合:30のインストールストーリー

  3. LinuxでのCronを使用したシステムタスクのスケジューリング

  1. Linuxatコマンドでタスクをスケジュールする

  2. ChronyでNTPを管理する

  3. 定期的なイベントのスケジュール:Cron/Cron の代替 (Celery を含む)

  1. Notify-Send With Cronを使用していますか?

  2. cronデーモンの内部はどのように機能しますか?

  3. タイムゾーンで開始時間を処理しますか?