Linux タイミング タスク スケジューリング (crontab)

1. クロンタブ

Crontabコマンドは、定期的に実行するコマンドを設定するために使用します。このコマンドは、標準入力デバイスから命令を読み取り、後で読み取って実行できるように「crontab」ファイルに命令を保存します。

Crontab を使用すると、システム タスクのスケジュール設定によく使用される、毎日午前 2 時のデータ更新などのオフライン タスクを定期的に処理できます。

1.1 サービスの起動と終了

通常、Crontab は Linux システムにインストールされますが、インストールされていない場合は、パッケージ管理ツールを使用してインストールできます。

yum -y install vixie-cronyum -y install crontabs

Crontab サービスの起動コマンドとシャットダウン コマンドは次のとおりです。

service crond start 
# 启动服务
service crond stop  
# 关闭服务
service crond restart   
# 重启服务
service crond reload    
# 重新载入配置
service crond status    
# 查看crontab服务状态

1.2タスクスケジューリングのグローバル構成

crontab グローバル タスク スケジュール設定は次のディレクトリにあります。

cron.d/       cron.daily/   cron.deny     cron.hourly/  cron.monthly/ crontab       cron.weekly/
  • cron.daily は 1 日に 1 回実行されるジョブです

  • cron.weekly は毎週実行されるジョブです

  • cron.monthly は月に 1 回実行されるジョブです

  • cron.hourly は 1 時間ごとに実行されるジョブです

  • cron.d は、システムが定期的に自動的に実行する必要があるタスクです。

  • crontabはタイミングタスクの実行ファイルを設定します。

  • cron.deny ファイルは、どのユーザーが Crontab の機能を使用できないかを制御するために使用されます。

1.3 ユーザープロファイル

各ユーザーには独自の crontab 構成ファイルがあり、crontab -e コマンドを使用して編集されます。保存後、システムはそれを /var/spool/cron/ ディレクトリに自動的に保存し、ファイルにはユーザー名に基づいた名前が付けられます。

Linux の crontab サービスは、/var/spool/cron、/etc/crontab、および /etc/cron.d 以下のすべてのコンテンツと crontab コマンドのリストを毎分読み取ります。

  • crontab -e: 現在のユーザーの crontab リストを編集します

  • crontab -l: 現在のユーザーの cron タスクのリストを表示します。

  • crontab -r: 現在のユーザーの crontab リストを削除します。

1.4 crontab タイミング タスクの形式

各 crontab レコードは時間指定されたタスクであり、時間指定されたユーザーは対応する定義ルールに従います。

画像

先頭の 6 つのアスタリスクの意味は次のとおりです。

内容の意味の説明:

計画 意味 範囲
初め"*" 毎時分 0-59
二番目"*" 一日の時間 0-23
第3"*" 月の日 1-31
第4"*" 今年の何月ですか 1-12
五番目"*" 曜日 0-7 (0 と 7 は両方とも日曜日を表します)
6番目のコマンド 実行するコマンド システムコマンドでも、自分で書いたスクリプトファイルでも構いません。

アスタリスク付きの各部分では、次の特殊記号が使用できます。

特殊文字 代表的な意味
* いつでも受け付けるという意味です!たとえば、例 1 の日、月、週はすべて * です。これは、**月や曜日に関係なく、フォローアップ コマンドを 12:00 に実行する**ことを意味します。
別居期間の意味を表します。たとえば、割り当てられるジョブが 3:00 と 6:00 である場合、次のようになります: 0 3,6 * * * コマンド時間パラメーターにはまだ 5 つの列がありますが、2 番目の列は 3,6 で、3 を表します。そして6作品!(スペースは追加できません)
- 時間を表します。たとえば、8 時から 12 時の間は 1 時間あたり 20 分が仕事です。 20 8-12 * * * コマンド 2 番目の列が 8-12 になることをよく見てください。8,9,10,11,12が該当するということですね!
/n n は数字を表し、「n 単位間隔ごと」、たとえば 5 分ごとに 1 回という意味になります。 */5 * * * * コマンドは非常に簡単です。* と /5 を使用して一致させます。0-59/5 と書くこともでき、同じ意味です。

1.5 Crontabコマンド

1.5.1 コマンドフォーマット

crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]

1.5.2 コマンド機能

crontab コマンドを使用すると、指定したシステム コマンドまたはシェル スクリプトを一定の間隔で実行できます。時間間隔の単位には、分、時間、日、月、週、および上記の任意の組み合わせを指定できます。このコマンドは、定期的なログ分析やデータのバックアップに非常に適しています。

1.5.3 コマンドパラメータ

-u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。
file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
-i:在删除用户的crontab文件时给确认提示。

2、crontab タイミング タスク インスタンス

2.1 時間周波数の例

混乱が生じる可能性があるため、通常は番号と曜日を同時に使用しないことをお勧めします。

時間表現の例:

時間 意味
10 * * * * コマンド 毎時10分にコマンドを実行します。
45 22 * * * コマンド 22:45にコマンドを実行します。
0 17 * * 1 コマンド 毎週1日の17:00にコマンドを実行
0 5 1,15 * * コマンド 毎月 1 日と 15 日の午前 5 時にコマンドを実行します。
40 4 * * 1-5 コマンド 毎週月曜日から金曜日の午前 4 時 40 分にコマンドを実行します。
*/10 4 * * * コマンド 毎日午前 4 時にコマンドを 10 分ごとに実行します
0 0 1,15 * 1 コマンド 毎月 1 日と 15 日、コマンドは毎月 1 日の 0:00 に実行されます。日と週はandの関係ではなく、orの関係です。
0 */10 * * * /usr/bin/curl http://www.baidu.com 10分ごとに定期的にアドレスをリクエストする
10 14 1 * * sh test.sh 毎月1日14:10に運行
*/1 * * * * sh test.sh コマンドを毎分実行する
59 23 * * 1,2,3,4,5 sh test.sh バックアップ ジョブは平日の毎日 23:59 に実行されます。
59 23 * * 1-5 sh test.sh バックアップ ジョブは平日の毎日 23:59 に実行されます。
10 0 * * * sh テスト.sh 午前0時10分に実行

2.2 入力と出力のリダイレクト

上記のデータのスケジュールタスクを更新する例で、update.sh実行時にエラーメッセージが出力された場合、どこに出力されるのでしょうか?

出力リダイレクトが構成されていない場合、スケジュールされたタスクは次のファイルにエラーを出力します: /var/log/mail/{$user}。これは非常に悪いことであり、異なるスクリプトを異なるログ ファイルに出力する必要があることがよくあります。これは便利です。スクリプトの実行ステータスを確認するには、出力リダイレクトを使用する必要があります。

58 23 * * * sh /home/work/update.sh >> /home/work/log/update.log 2>&1

Linux は、標準ストリームを表すファイル記述子として 0 ~ 3 を使用します。

名前 タイプ ファイル記述子 操作する
stdin標準入力 標準入力 0 <、<<
stdout標準出力 標準出力 1 >、>>
stderr標準エラー出力 標準エラー出力 2 2>,2>>

上記のスケジュールされたタスク スクリプトで、update.sh の後の >> は、出力が update.log ファイルに追加されることを示し、2>&1 は、標準エラー出力のリダイレクトが標準出力と同等であることを示します。

正しいログとエラー ログの出力がファイル メソッドに書き込まれるかどうか:

  1. 何も出力しない(方法1を推奨)
*/1 * * * * /root/XXXX.sh >/dev/null 2>&1 
或
*/1 * * * * /root/XXXX.sh &>/dev/null    //&表示任何内容
  1. 正しいログとエラーのログの両方を /tmp/load.log に出力します。
*/1 * * * * /root/XXXX.sh > /tmp/load.log 2>&1
  1. 正しいログのみを /tmp/load.log に出力します
*/1 * * * * /root/XXXX.sh > /tmp/load.log
或
*/1 * * * * /root/XXXX.sh 1> /tmp/load.log    //1可以省略
  1. エラーログのみを/tmp/load.logに出力します。
*/1 * * * * /root/XXXX.sh 2> /tmp/load.log

部分的に説明すると、

/dev/null 代表空设备文件
> 代表重定向到哪里
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1

2.3 入力 nohup を無視する

場合によっては、スケジュールされたタスク スクリプトの前に nohup コマンドが表示されることもあります。これは、後続のスクリプトが入力を無視することを指定するために使用されます。

58 23 * * * nohup sh /home/work/update.sh >> /home/work/log/update.log 2>&1

2.4 バックグラウンド実行と

コンソール上で直接実行されるか、スケジュールされたタスク スクリプト内で実行されるかに関係なく、コマンドの末尾に & 記号を追加して、現在のコマンドがバックグラウンドで実行されており、コンソールを占有しないことを示します。

58 23 * * * nohup sh /home/work/update.sh >> /home/work/log/update.log 2>&1 &

ここで注意したいのは、実行したコマンドに入力待ちのインタラクションがある場合、&を使ってバックグラウンドでコマンドを実行すると常に入力待ちになりますが、入力がない場合はスタックしてしまいます。

2.5 時間処理

上記の更新タスクを振り返ると、毎日の実行結果が update.log ファイルにリダイレクトされます。出力が多い場合は、毎日異なるファイルを出力する必要があり、出力ディレクトリで日付を指定することで使用できます。 . セグメンテーション。次のように:

58 23 * * * nohup sh /home/work/update.sh >> /home/work/log/`update_"date +\%Y\%m\%d".log` 2>&1 &# 或者下面的形式58 23 * * * nohup sh /home/work/update.sh >> "/home/work/log/update_"date +\%Y\%m\%d".log" 2>&1 &

ここでは date 関数が使用されています。crontab のスクリプト コマンドは、コマンド ラインで直接実行されるスクリプトとは異なる場合があることに注意してください。特に date 関数の % はエスケープする必要があります。

次のコマンドをコマンド ラインで直接実行できます。

sh /home/work/update.sh >> /home/work/log/update_`date +"%Y%m%d".log` 2>&1 &

スケジュールされたタスクと同じ効果を実現するために、update_20201120.log ファイルに出力されます。

ただし、crontab で直接設定すると認識されず、スケジュールされたタスクは実行されません。次の crontab タスクは実行されず、date 関数はエラーを報告します。

58 23 * * * nohup sh /home/work/update.sh >> /home/work/log/`update_"date +%Y%m%d".log` 2>&1 &

付録 A

A.1 注意事項

  1. 新しく作成された cron ジョブはすぐには実行されず、実行には少なくとも 2 分かかります。cronが再起動されたらすぐに実行

  2. crontab が突然失敗した場合は、/etc/init.d/crond restart を試して問題を解決できます。または、ログをチェックして、ジョブが実行されたか、エラー tail -f /var/log/cron が報告されたかどうかを確認します。

  3. crontab -r をむやみに実行しないでください。ユーザーの Crontab ファイルを Crontab ディレクトリ (/var/spool/cron) から削除します。そのユーザーの crontab はすべて消えています。

A.2 参考ブログ

おすすめ

転載: blog.csdn.net/An1090239782/article/details/129176191