Linux のスケジュールタスク Crontab コマンドの使用に関する詳細な説明と概要

Linux のスケジュールタスク Crontab コマンドの使用に関する詳細な説明と概要

crontab コマンドは、Unix および Linux で定期的な実行命令を設定するために使用されます。これは、インターネットで非常に一般的なテクノロジです。多くのタスクは、周期的な実行のために crontab で設定されます。

crontab を使用しない場合、タスクは常駐プログラムとなり、プログラムに高い要求が課せられます。1 つの要件は、プログラムが 24 時間 365 日稼働していること、もう 1 つは、スケジュール プログラムが信頼できることです。実際の作業では、90% のプログラムは、上記の 2 つの問題を解決するためにそれほど多くの時間と労力を費やす必要はありません。独自のビジネス ロジックを記述し、それを産業グレードのプログラムである Crontab を通じてスケジュールするだけです。Crontab の信頼性と堅牢性に疑いの余地はありません。

crontab コマンドの簡単な紹介

1 分ごとにデータを同期するタスクを設定するとします。この同期スクリプトのパスは /home/blue/do/rsyncfile.sh です。次のように設定します。ユーザー blue として、ターミナルに次のように入力します。

crontab -e
# その後、vi 編集画面に入り、作業を編集できるようになります。各ジョブが行になっていることに注意してください。
#タイムシェアリング日、月、週|<==================タスクの完全なコマンドライン * * * * * /home/blue/do/rsyncfile.sh

デフォルトでは、/etc/cron.deny に含まれていないユーザーは誰でも、直接「crontab -e」を発行して自分のルーチン コマンドを編集できます。全体のプロセスは上記のとおりです。vi 編集画面に入り、1 行ずつ編集します。編集後は、「:wq」と入力して保存し、vi を終了します。

5 分ごとにデータ同期を実行するようにスクリプトを変更する必要がある場合は、crontab -e を使用してエディターに入ることもできます。

*/5 * * * * /home/blue/do/rsyncfile.sh

サーバーに問題があり、1 日データが同期されない場合は、データを補充する必要があります。データを補充するためのスクリプトが /home/blue/do /rsyncfile_day.sh であるとします。ただし、昼間はピーク期間であり、夜間はオフピーク期間であるため、ユーザーはあまりいません。データを補充すると、特に日中は多くの帯域幅が占有され、通常の業務に影響します。したがって、通常は午前 2 時にデータ補充タスクを開始し、crontab -e を使用してエディターに入ります。

0 2 1 4 * /home/blue/do/rsyncfile_day.sh

このようにして、データ補完スクリプトは 4 月 1 日の午前 2 時に開始されます。

データの同期は、インターネット企業では非常に一般的なタスクです。ここで、crontab の魅力がわかります。最も単純なビジネス ロジックを記述し、スケジュールを crond に任せるだけで、高い信頼性でタスクを完了できます。このようなスケジュール プログラムを自分で記述する場合、信頼性と安定性を実現するのにどれだけの労力がかかるかはわかりません。

crontab コマンドの構文

crontab [-u ユーザー名] [-l|-e|-r]
オプションとパラメータ:
-u: このタスクを実行できるのは root だけです。つまり、他のユーザーが crontab タスク スケジュールを作成/削除できるように支援できます。
-e: crontabジョブの内容を編集 -l: crontabジョブの内容を表示 -r: すべてのcrontabジョブの内容を削除します。1つの項目のみを削除する場合は、-eを使用して編集してください。

ユーザーの現在の crontab の内容を照会します。

crontab -l
*/5 * * * * /home/blue/do/rsyncfile.sh
0 2 1 4 * /home/blue/do/rsyncfile_day.sh

ユーザーの現在の crontab をクリアします。

crontab -r
crontab -l
青のcrontabがない

現在のユーザーの crontab タスクを削除する場合は、crontab -e を使用してエディターに入り、対応するタスクを削除します。

crontab コマンドの制限

/etc/cron.allow : crontab を使用できるアカウントを記述します。このファイルに含まれていないユーザーは crontab を使用できません。

/etc/cron.deny : crontab の使用を許可されていないアカウントがここに書き込まれます。ユーザーがこのファイルに記録されていない場合は、crontab を使用できます。

優先順位としては、/etc/cron.allow が /etc/cron.deny よりも優先されます。上記から判断すると、これら 2 つのファイルのうち 1 つだけが制限対象として選択されます。したがって、設定の判断に影響を与えないように、1 つだけ残すことをお勧めします。一般的に、システムはデフォルトで /etc/cron.deny を保持します。crontab を実行させたくないユーザーを、1 行に 1 アカウントずつ /etc/cron.deny に書き込むことができます。

crontab設定ファイルの詳細な説明

crontab -e 、ユーザーの cron 用に設計されています。これが「システムの日常的なタスク」である場合は、/etc/crontab ファイルを編集する必要があります。

それは crontab -e です。この crontab は実際には実行中のファイル /usr/bin/crontab ですが、/etc/crontab は「プレーン テキスト ファイル」であり、root として編集する必要があります。

まず、crontabファイルの内容を見てみましょう。

/etc/crontab を編集する
 
# /etc/crontab: システム全体のcrontab
# 他のcrontabとは異なり、`crontab'を実行する必要はありません
# このファイルを編集するときに新しいバージョンをインストールするコマンド
# および/etc/cron.d内のファイル。これらのファイルにはユーザー名フィールドもあり、
# 他の crontab では実行されません。
 
シェル=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
 
# mh dom monitor dow user コマンド
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * ルートテスト -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 ルートテスト -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * ルートテスト -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

このファイルは、先ほど発行した crontab -e の内容とほぼ同じです。少しだけ違うところがある

PATH=....:

実行ファイルを入力するための検索パスは次のとおりです。デフォルトのパス構成を使用するだけで十分です。

17 * * * * root cd / && run-parts --report /etc/cron.hourly:

この/etc/crontabは、1 時間ごと、毎日、毎週、毎月 1 回実行される 4 つのタスクが事前設定されています。 しかし、5 つの列の後に続くのはコマンドではなく、新しい列、つまり「次のコマンドを実行する ID」です。これはユーザーのcrontab -eとは異なります。ユーザー自身の crontab では ID を指定する必要がないため、 /etc/crontabで ID を指定する必要があります。上記の表によれば、システムのデフォルトのルーチン作業は root として実行されます。

では、次の一連のコマンドは何でしょうか? which run-partsを使用して検索できます。これは実際には bash スクリプトです。 /usr/bin/run-partsに直接移動すると、このコマンドがそれに続く「ディレクトリ」内のすべてのファイルを取得して実行することがわかります。これは、「システムで 1 時間ごとにコマンドをアクティブに実行したい場合は、コマンドをスクリプトに記述し、そのファイルを/etc/cron.hourly/ディレクトリに配置する」という意味です。

システムがデフォルトで一連の日常的なタスクをどのようにスケジュールするかをご存知ですか? ll /etc/cron.daily実行すると、多数のファイルが表示されます。これらのファイルはシステムによって提供されるスクリプトであり、これらのスクリプトは毎日午前 6:25 に実行を開始します。

システムが 2 分ごとにこのディレクトリ内のすべての実行可能ファイルを実行するようにディレクトリを作成したいとします。/etc/crontab に次の行を記述します。

*/2 * * * * ルート実行部分 /etc/cron.min

もちろん、/etc/cron.min ディレクトリが存在している必要があります。 「プログラム」を実行するだけで、ディレクトリが必要ない場合はどうすればよいでしょうか?どうすればいいですか?たとえば、ネットワーク トラフィックを検出するときに、5 分ごとに検出して分析するとします。次のように記述できます。

*/5 * * * * ルート /bin/mrtg /etc/mrtg/mrtg.cfg

どうやって!ルーチンコマンドの作成は簡単です!システム管理者であり、日常的なシステムメンテナンスを担当している場合は、/etc/crontab ファイルを直接変更できます。便利で管理も簡単!

crontabコマンドの原理

ユーザーが crontab コマンドを使用してタスク スケジュールを作成すると、タスクは/var/spool/cron/に記録され、アカウント番号で識別されます。たとえば、blue が crontab を使用した後、その作業は/var/spool/cron/blueに記録されます。ただし、入力構文エラーのために cron が実行されない可能性があるため、vi を使用してファイルを直接編集しないでください。さらに、cron によって実行されるすべてのジョブは/var/log/cron /var/log/cron

crond サービスの最小検出制限は「分」なので、「cron は/etc/crontab/var/spool/cronのデータ内容を 1 分に 1 回読み取ります」。したがって、 /etc/crontabファイルを編集して保存すれば、cron 構成は自動的に実行されます。

注意: Linux の crontab は/etc/crontab内のルーチン タスクを 1 分ごとに自動的に再読み込みするのに役立ちます。ただし、何らかの理由または他の Unix システムでは、crontab はメモリに読み込まれるため、/etc/crontab を変更した後、すぐに実行されない場合があります。この場合は、crond サービスを再起動してください。 /etc/init.d/crond restartまたはservice crond restart

crontabコマンド形式の詳細な説明

各タスク (各行) の形式には 6 つのフィールドがあり、これらの 6 つのフィールドの意味は次のとおりです。

代表的な意義時間日付(曜日)注文
数値範囲0-59 0-23 1-31 1-12 0-7はい、注文してください。

さらに面白いのは「周」です!週の数字が0または7の場合は「日曜日」を意味します。さらに、いくつかの補助文字があり、おおよそ次のようになります。

特殊文字代表的な意義
*(アスタリスク)いつでも受付可能です!たとえば、例 1 では、日、月、週がすべて * になっています。これは、「何月何日であっても、後続のコマンドを 12:00 に実行する」ことを意味します。
、(コンマ)

期間を区切ることを意味します。例えば、発行するタスクが 3:00 と 6:00 の場合、次のようになります。

0 3,6 * * * コマンド

時間パラメータにはまだ 5 つの列がありますが、2 番目の列は 3,6 です。つまり、3 と 6 の両方が適用可能です。

- (マイナス記号)

期間を表します。たとえば、タスクは 8 時から 12 時まで 20 分ごとに実行されます。

20 8-12 * * * コマンド

よく見ると、2 列目が 8 ~ 12 になっていることがわかります。つまり、8、9、10、11、12 はすべて適用可能です。

/n(スラッシュ)

n は数値を表し、「n 単位間隔ごと」を意味します。たとえば、5 分ごとに 1 回の場合は次のようになります。

*/5 * * * * コマンド

とても簡単です! * と /5 を一緒に使用すると、0-59/5 と記述することもでき、同じ意味になります。

周と太陽と月は共存できない

もう一つの注意点は、「サイクルとして週または日と月を使用できますが、「月と曜日」モデルでは作業できません。」です。 つまり、次のようなタスク スケジュールを記述することはできません。

30 12 11 9 5 root echo "just test" <==これは間違いです

当初、このタスクは 9 月 11 日が金曜日の場合にのみ実行されると考えていました。残念ながら、システムによって、このタスクは毎週金曜日、または毎年 9 月 11 日に実行されると判断される可能性があります。これは、当初の計画とは異なります。したがって、この点には注意する必要があります。上記の記述は誤りです。

CentOS で crontab の実行履歴を表示する

crontab にスケジュールされたタスクを追加しましたが、期待した結果が得られませんでした。crontab が対応するタスクを実行していないのではないかと疑いました。しかし、crontab が実行されたかどうかをどのように判断すればよいのでしょうか?

これには、crontab の実行履歴を表示する必要があります。具体的な場所は次のとおりです。

cd /var/log
テール -100 クローン

cron ファイルで実行された関連するスケジュールされたタスクを確認できます。

Crontab コマンド形式の説明

crontab -e を使用して、実行するコマンドを追加できます。 コマンド実行の結果は、標準出力またはエラー出力のいずれであっても、電子メールでユーザーに送信されます。

追加するコマンドは次の形式である必要があります。

 * * * * * /コマンドパス

最初の 5 つのフィールドは、作業をいつ開始するかを指定する整数値を取ることができ、6 番目のフィールドは文字列、つまりコマンド フィールドであり、crontab によって実行されるようにスケジュールされたコマンドが含まれます。 各フィールドはスペースとタブで区切られます。

最初の 5 つのフィールドは次のものを表します。

分: 0-59
営業時間: 1-23
日付: 1-31
月: 1-12
曜日: 0~6 (0 は日曜日)

いくつかの特殊記号も使用できます:

*: いつでも
,: はセグメンテーションを示します -: セグメントを示します。たとえば、2 番目の end: 1-5 は 1 から 5 のポイントを意味します
/n: は、n 単位ごとに 1 回実行することを意味します。たとえば、2 番目の段落では、*/1 はコマンドを 1 時間ごとに 1 回実行することを意味します。 1-23/1 と表記することもできます。

例:

00 8,12,16 * * * /data/app/scripts/monitor/df.sh
30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh
10 8,12,16 * * * /data/app/scripts/monitor/check_ind_unusable.sh
10 8,12,16 * * * /data/app/scripts/monitor/check_maxfilesize.sh
10 8,12,16 * * * /data/app/scripts/monitor/check_objectsize.sh

: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

Crontabコマンドのバックグラウンド実行&

ジョブがフォアグラウンドで実行されている場合、端末はジョブによって占有されます。ジョブがバックグラウンドで実行されている場合、端末は占有されません。 & コマンドを使用すると、ジョブをバックグラウンドで実行できます。

のように:

30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh &

ジョブをバックグラウンドで実行するときには注意してください。ユーザーの操作を必要とするコマンドをバックグラウンドで実行しないでください。そうしないと、マシンはただ待機するだけになります。

ただし、バックグラウンドで実行されているジョブは引き続き結果を画面に出力し、作業を妨げます。バックグラウンドで実行するジョブが大量の出力を生成する場合は、次の方法を使用してその出力をファイルにリダイレクトするのが最適です。

のように:

コマンド >out.file 2>&1 &

この例では、2>&1 は、すべての標準出力とエラー出力が out.file というファイルにリダイレクトされることを意味します。

Crontab コマンド 2>&1 の意味

例を見てみましょう:

0 2 * * * /u01/test.sh >/dev/null 2>&1 &

この文は、このコマンドをバックグラウンドで実行し、エラー出力 2 を標準出力 1 にリダイレクトし、すべての標準出力 1 を /dev/null ファイルに格納する、つまりクリアすることを意味します。

以下に意味する数字をいくつか示します。

0はキーボード入力を意味します
1は標準出力を意味します
2はエラー出力を示す

次のように書くこともできます。

0 2 * * * /u01/test.sh 1>/u01/out.file &
0 2 * * * /u01/test.sh 2>/u01/out.file &
0 2 * * * /u01/test.sh 2>/u01/out.file 2>&1 &

tesh.sh コマンドの出力を out.file にリダイレクトします。つまり、出力内容は画面に印刷されず、out.file ファイルに出力されます。

2>&1 はエラー出力を標準出力にリダイレクトします。 次に、標準入力をファイル out.file にリダイレクトします。

&1 はファイル記述 1 を表し、標準出力を意味します。ここで & が欠落している場合は、数字 1 となり、ファイル 1 へのリダイレクトを意味します。

& :バックグラウンド実行

テスト:

ls 2>1: ファイル 2 が存在しないというエラーは報告されませんが、空のファイル 1 が出力されます。
ls xxx 2>1: 1にファイルxxxが存在しないというエラーが出力されます。
ls xxx 2>&1: ファイル 1 は生成されませんが、エラーは標準出力に出力されます。
ls xxx >out.txt 2>&1 == ls xxx 1>out.txt 2>&1: リダイレクト シンボル > はデフォルトで 1 に設定されているので、この文はエラー出力と標準出力の両方を out.txt ファイルに転送します。

Crontabコマンド2>&1が最後に記述されている理由

フォーマット: コマンド > ファイル 2>&1 == コマンド 1> ファイル 2>&1

まず、コマンド > file は標準出力を file にリダイレクトし、2>&1 は標準出力をコピーした標準エラーで、これも file にリダイレクトされます。最終結果は、標準出力とエラーの両方が file にリダイレクトされることです。

次のように変更した場合: コマンド 2>&1 >ファイル

2>&1 標準エラーは標準出力の動作をコピーしますが、標準出力は端末内に残ります。 >file 出力はファイルにリダイレクトされますが、標準エラーは端末に残ります。

学んだ教訓:

毎晩 23:00 にサーバー上で Python スクリプトを実行して、MySql データベースをバックアップする予定です。コマンドは次のとおりです。

* 23 * * * python /var/www/html/crontab_python/back_db.py >/dev/null 2>&1

その結果、毎回 60 個のバックアップ ファイルが生成されました。スケジュールされたタスク コマンドを注意深く確認したところ、「分」の位置に「0」が欠落していることがわかりました。これは、「*」がその位置の任意の値を表すためです。変更内容は次のとおりです。

0 23 * * * python /var/www/html/crontab_python/back_db.py >/dev/null 2>&1

次にPHPスクリプトのスケジュールされた実行

0 4 * * * /usr/local/php/bin/php /usr/local/nginx/www/backup-db/backup_db.php 172.16.8.26 >/dev/null 2>&1
0 4 * * * /usr/local/php/bin/php /usr/local/nginx/www/backup-db/backup_db.php 172.16.10.151 >/dev/null 2>&1

この記事では、LinuxのスケジュールタスクCrontabコマンドの詳細な使用方法を紹介し、Crontabコマンドの使用上のヒントと、仕事で遭遇する問題の解決策をまとめています。皆さんのお役に立てば幸いです。

以下もご興味があるかもしれません:
  • Linux 環境で crontab コマンドを使用して、スケジュールされた定期的な実行タスクを設定します (PHP 実行コードを含む)
  • 特定のコマンドを実行する必要があるときにシェル スクリプトの実行をタイミングする Linux crontab のソリューション
  • Linux での crontab スケジュール実行コマンドの詳細な説明
  • Linux でコマンドとスクリプトを定期的に実行する (cron、crontab、anacron)
  • Linux でタスクをスケジュール実行するための at コマンドと crontab コマンドの詳細な説明
  • Linux Crontab の起動、実行、編集コマンド
  • Linux crontab コマンドの形式と詳細な例 (推奨)
  • Linux crontab コマンドの使用

<<:  Weibo の一括フォロー解除機能を実装する JavaScript コード

>>:  Mysqlマスタースレーブ同期の実装原理

推薦する

VMware 仮想マシンの 3 つの接続方法の例の分析

NATこのようにして、仮想マシンのネットワーク カードはホストの VMnet8 に接続されます。この...

MySQL 文字列連結関数 GROUP_CONCAT の詳細な説明

前回の記事では、クロステーブル更新について書きました。自分が書いた SQL を見たとき、自分がバカみ...

IE環境では、divの高さはフォントの高さよりも大きくなければならないと規定されています。

コードをコピーコードは次のとおりです。 <div class="content&qu...

CSS Houdini でダイナミックな波効果を実現

CSS Houdini は、CSS 分野における最もエキサイティングなイノベーションとして知られてい...

ROS で Turtlebot3 移動ロボットを制御するための基本的なチュートリアル

中国語チュートリアルhttps://www.ncnynl.com/category/turtlebo...

ReactにおけるuseRefの具体的な使い方

React の経験がある人なら、コンポーネントインスタンスオブジェクトや DOM オブジェクトを取得...

よく使われるLinuxコマンド「ll」が無効、またはコマンドが見つからないという問題を解決します

質問:よく使用されるコマンド「ll」が無効であるか、コマンドが見つかりません理由: 「ll」コマンド...

SQLで同じフィールドの異なる値のデータ統計を実行する

適用シナリオ: シールのさまざまな状態に応じて、さまざまな状態のシールの数をカウントする必要がありま...

UI を通じて Docker を管理する方法

Docker はますます多くのシナリオで使用されています。コマンドラインツールに慣れていない人にとっ...

クールなIoT大画面機能を実現するHTML+VUEページング

効果デモ.html <html> <ヘッド> <メタ文字セット=&qu...

Dockerはnextcloudを使用してプライベートBaiduクラウドディスクを構築します

突然、ドキュメントの保存と共同作業のためのプライベート サービスを構築する必要がありました。多くの場...

Vue フロントエンドで PDF を生成してダウンロードする方法

目次1. インストールと導入2. PDFファイルをパッケージ化してエクスポートする方法構成の詳細PD...

IIS サーバーから apk ファイルをダウンロードする際の 404 エラーの解決策

最近、IIS をサーバーとして使用すると、apk ファイルがサーバーにアップロードされましたが、ダウ...

HTMLタグを閉じるのを忘れないでください

Web 標準に準拠した Web ページの構築は、jb51.net が常に全員と議論しているトピックで...

DockerはホストのMysql操作に接続します

今日、会社のプロジェクトでは docker を設定する必要があります。Windows に正常にインス...