11 Linux 実践操作 - リアルタイム タスク スケジューリング
記事ディレクトリ
- 学習ビデオは Station B からのものです[Xiaobie Getting Started は理解しやすいです] 2021 Han Shuping は 1 週間で Linux を学習しました。
- 使用できる素材は次のとおりです。ダウンロード リンクは記事の最後にあります。
11.1 繰り返しタスクのスケジュール設定crond
11.1.1crond
基本的な構文
まず、タスク スケジューリングの基本的な概念を紹介します。いわゆる「タスク スケジューリング」とは、Linux システムによって特定の時間に実行される特定のコマンドまたはプログラムを指します。ウイルス スキャン、データベース バックアップなど、一部のコマンド/プログラムは繰り返し実行する必要があります。これらのコマンド/プログラムは、crond と呼ばれるバックグラウンド プログラムによって管理されます (上の図を参照)。一部のコマンド/プログラムは実行するだけで済みます。ソフトウェアの更新などの場合、これらのコマンド/プログラムは atd と呼ばれるバックグラウンド プログラムによって管理されます。このセクションでは、繰り返しスケジュールされたタスクの設定の使用方法を紹介し、次のセクションでは、1 回限りのスケジュール タスクの設定のcrontab
使用方法を紹介します。基本的な構文はat
次のとおりです。crontab
# 基本语法-crontab
crontab [选项] # 命令行终端的格式
五个占位符表示的时间 命令 # 进入重复定时文件中的格式
# 常用选项-crontab
-e 编辑当前用户的crontab定时任务。
-l 查询当前用户所有的crontab任务。
-r 删除当前用户所有的crontab任务。
H 列出当前有那些任务调度。
service crond restart 重启crond任务调度程序。
上記の繰り返しスケジュールタスクを追加するコマンドとしてよく使われるのは、crontab -e
このとき繰り返しスケジュールタスクの管理ファイルを入力することですが、各行が繰り返しスケジュールタスクを表しており、このファイルの操作方法は vim エディタと同じです。繰り返しスケジュールされたタスクを追加する方法は、前述したように「 」です五个占位符表示的时间 指令/脚本
。これらの 5 つのプレースホルダーがどのように時間を表すかを詳しく紹介しましょう。
5 つのプレースホルダの説明:以下の表 11-1 に示すように、 「分、時、日、月、日」を順番に表します。
特殊記号の説明:
- アスタリスク
*
: 任意の時間を表します。たとえば、最初の「*」は、1 分ごとに実行されることを意味します。- カンマ
,
: 離散時間を表します。たとえば、「0 8,12,16 * * * 命令
」は、コマンドを毎日 8:00、12:00、16:00 に 1 回実行することを意味します。- バー
-
: 連続した時間範囲を表します。たとえば、「0 5 * * 1-6 命令
」は、月曜日から土曜日の午前 5 時にコマンドを実行することを意味します。*/n
:実行頻度を表します。たとえば、「*/10 * * * * 命令
」はコマンドを 10 分ごとに実行することを意味します。時刻設定例:
45 22 * * * 命令
: 毎日 22:45 にコマンドを実行します。0 17 * * 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 に実行されます。「曜日」と「日付」は同時に表示しないことが最善です。これらはすべて曜日を定義するものであり、管理者が非常に混乱しやすいためです。
プロジェクト | 意味 | 範囲 |
---|---|---|
初め"*" | 毎時分 | 0-59 |
二番目"*" | 一日の時間 | 0-23 |
第3"*" | 月の日 | 1-31 |
第4"*" | 今年の何月ですか | 1-12 |
五番目"*" | 曜日_ _ | 0-7 (0 と 7 は両方とも日曜日を表します) |
最後に、ケースを使用して、上で学んだことを検証します。/etc
ファイルリストをファイルに上書きする場合/tmp/to.txt
、つまり命令の実行を繰り返す場合ll /etc/ > /tmp/to.txt
、タスクスケジュールファイルに保存する必要があるコードは次のとおりです。
*/1 * * * * ll /etc/ > /tmp/to.txt
11.1.2 応用例
以下に 4 つの適用ケースを示します。
【ケース 1】 現在の日付情報 ( date
)を/tmp/mydate
1 分ごとにファイルに追加します。
[root@CentOS76 ~]# crontab -e
####################################
# 按照vim编辑器的格式,输入以下命令并保存:
# */1 * * * * date >> /tmp/mydate
####################################
no crontab for root - using an empty one
crontab: installing new crontab
[root@CentOS76 ~]# crontab -l
*/1 * * * * date >> /tmp/mydate
[root@CentOS76 ~]# ll /tmp | grep mydate
-rw-r--r--. 1 root root 43 7月 22 16:08 mydate
[root@CentOS76 ~]# cat /tmp/mydate
2023年 07月 22日 星期六 16:08:01 CST
【ケース2】 1分ごとに日付( date
)とカレンダー(cal
)をファイルに追加します/home/mycal
。もちろん、crontab -e
命令を 2 回記述することもできますが、これはスマートではないので、これら 2 つの命令をファイルに入れ、そのファイルを 1 分ごとに 1 回実行することができます。
[root@CentOS76 ~]# vim /home/my.sh
####################################
# 按照vim编辑器的格式,输入以下命令并保存:
# date >> /tmp/mycal
# cal >> /tmp/mycal
####################################
[root@CentOS76 ~]# ll /home | grep my.sh
-rw-r--r--. 1 root root 37 7月 22 16:15 my.sh
[root@CentOS76 ~]# chmod u+x /home/my.sh
[root@CentOS76 ~]# ll /home | grep my.sh
-rwxr--r--. 1 root root 37 7月 22 16:15 my.sh
[root@CentOS76 ~]# crontab -e
####################################
# 按照vim编辑器的格式,输入以下命令并保存:
# */1 * * * * /home/my.sh >> /tmp/mycal
####################################
crontab: installing new crontab
[root@CentOS76 ~]# crontab -l
*/1 * * * * date >> /tmp/mydate
*/1 * * * * /home/my.sh >> /tmp/mycal
# 注:这个空行是我在my.sh里面多打了一行。
[root@CentOS76 ~]# cat /tmp/mycal
2023年 07月 22日 星期六 16:18:01 CST
七月 2023
日 一 二 三 四 五 六
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
# 上面的日期没有背景反转高亮
[ケース 3]毎日午前 2 時にtestdb
mysql データベースをファイルにバックアップします。
ヒント: バックアップ コマンドは次のとおりです。
mysqldump -u root -p密码 数据库 >> /home/db.bak
[root@CentOS76 ~]# crontab -e
####################################
# 按照vim编辑器的格式,输入以下命令并保存:
# 0 2 * * * mysqldump -u root -proot testdb >> /home/db.bak
####################################
crontab: installing new crontab
[root@CentOS76 ~]# crontab -l
*/1 * * * * date >> /tmp/mydate
*/1 * * * * /home/my.sh >> /tmp/mycal
0 2 * * * mysqldump -u root -proot testdb >> /home/db.bak
【ケース4】 現在のユーザーのスケジュールされたタスクを削除します。
[root@CentOS76 ~]# crontab -l
*/1 * * * * date >> /tmp/mydate
*/1 * * * * /home/my.sh >> /tmp/mycal
0 2 * * * mysqldump -u root -proot testdb >> /home/db.bak
[root@CentOS76 ~]# crontab -r
[root@CentOS76 ~]# crontab -l
no crontab for root
11.2 1 回限りのスケジュールされたタスク -at
11.2.1at
基本的な構文
上記の crond プログラムで管理されているタスクは繰り返し実行されるので、定期的に特定の計画を実行したい場合があります。これが次に紹介するatdプログラムです。デフォルトでは、atd デーモンは 60 秒ごとにジョブ キューをチェックし、ジョブがある場合はジョブの実行時間をチェックし、その時間が現在時刻と一致する場合はジョブを実行します。at
このコマンドは 1 回限りのスケジュールされたタスクであり、1 つのタスクが実行された後はタスクは実行されないことに注意してください。また、at
このコマンドを使用する場合は、atd プロセスが開始されていることを確認する必要があります。そうしないと、スケジュールされたタスクを実行できません。たとえば、ps -ef | grep atd
現在のバックグラウンド プログラムに atd プログラムが存在するかどうかを確認できます。次の場合の基本構文at
:
# 基本语法-at
at [选项] [时间] # 注意:输入 两次Ctrl+D 结束at命令的输入!
atq # 等价于at -l,列出当前用户的at任务列表。
atrm x # 等价于at -d,删除当前用户的第x个at任务。
# 命令选项【使用较少】-at
-m 当指定的任务被完成后,将给用户发送邮件,即使没有标准输出。
-I atq的别名,查询。
-d atrm的别名,删除。
-v 显示任务将被执行的时间。
-c 打印任务的内容到标准输出。
-V 显示版本信息。
-q<队列> 使用指定的队列。
-f<文件> 从指定文件读入任务而不是从标准输入读入。
-t<时间参数> 以时间参数的形式提交要运行的任务。
上述at
的基本语法中包括“选项”和“时间”。实际上,at
很少使用“选项”,所以“时间”的定义才是重点。下面是at
指定时间的6种方法【重点】:
- 当天时间:接受在当天的
hh:mm
(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。例如04:00
。- 模糊词语:使用
midnight
(深夜)、noon
(中午)、teatime
(饮茶时间,一般是下午4点)等比较模糊的词语来指定时间。- 12小时计时制:即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。例如
12pm
。- 具体日期【中国常用】:指定格式为
month day
(月日)或mm/dd/yy
(月/日/年)或dd.mm.yy
(日.月.年),指定日期必须跟在指定时间的后面。例如04:00 2021-03-1
。- 相对计时法:指定格式为
now + count time-units
。now就是当前时间;time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期);count是时间的数量,几天、几小时。例如now + 5 minutes
。- 直接使用
today
(今天)、tomorrow
(明天)来指定完成命令的时间。
11.2.2 应用实例
下面展示五个应用案例,注意at>
所在行输入完成后,输入 两次ctrl+D 才能退出at
。
【案例1】2天后的下午5点执行指令/bin/ls /home
。
[root@CentOS76 ~]# at 5pm + 2 days
at> /bin/ls /home<EOT>
job 7 at Mon Jul 24 17:00:00 2023
【案例2】使用atq
命令来查看系统中没有执行的一次性工作任务。
[root@CentOS76 ~]# atq
7 Mon Jul 24 17:00:00 2023 a root
【案例3】明天17点钟,输出时间(date
)到文件/root/date100.log
。
[root@CentOS76 ~]# at 5pm tomorrow
at> date > /root/date100.log<EOT>
job 8 at Sun Jul 23 17:00:00 2023
【案例4】2分钟后,输出时间(date
)到文件/root/date200.log
。
[root@CentOS76 ~]# at now + 2 minutes
at> date > /root/date200.log<EOT>
job 9 at Sat Jul 22 15:47:00 2023
[root@CentOS76 ~]# atq
9 Sat Jul 22 15:47:00 2023 a root
7 Mon Jul 24 17:00:00 2023 a root
8 Sun Jul 23 17:00:00 2023 a root
[root@CentOS76 ~]# ll
总用量 44
-rw-------. 1 root root 1883 7月 13 17:12 anaconda-ks.cfg
-rw-r--r--. 1 root root 43 7月 22 15:47 date200.log
-rw-r--r--. 1 root root 1931 7月 13 17:13 initial-setup-ks.cfg
drwxr-xr-x. 2 root root 4096 7月 13 19:44 公共
drwxr-xr-x. 2 root root 4096 7月 13 19:44 模板
drwxr-xr-x. 2 root root 4096 7月 13 19:44 视频
drwxr-xr-x. 2 root root 4096 7月 13 19:44 图片
drwxr-xr-x. 2 root root 4096 7月 13 19:44 文档
drwxr-xr-x. 2 root root 4096 7月 13 19:44 下载
drwxr-xr-x. 2 root root 4096 7月 13 19:44 音乐
drwxr-xr-x. 2 root root 4096 7月 13 19:44 桌面
[root@CentOS76 ~]# cat /root/date200.log
2023年 07月 22日 星期六 15:47:00 CST
[root@CentOS76 ~]# atq # 查看job执行完毕后,队列中是否还存在
7 Mon Jul 24 17:00:00 2023 a root
8 Sun Jul 23 17:00:00 2023 a root
【案例5】删除已经设置的所有一次性定时任务。
[root@CentOS76 ~]# atq
7 Mon Jul 24 17:00:00 2023 a root
8 Sun Jul 23 17:00:00 2023 a root
[root@CentOS76 ~]# atrm 7
[root@CentOS76 ~]# at -r 8
[root@CentOS76 ~]# atq
[root@CentOS76 ~]#
【案例6】1分钟后执行指令文件/home/my.sh
。
[root@CentOS76 ~]# at now + 1 minutes
at> /home/my.sh<EOT>
####################################
# my.sh内容为:
# date >> /tmp/mycal
# cal >> /tmp/mycal
# 并且,此时已经删除/tmp/mycal文件。
####################################
job 13 at Sat Jul 22 16:47:00 2023
[root@CentOS76 ~]# atq
13 Sat Jul 22 16:47:00 2023 a root
[root@CentOS76 ~]# ll /tmp | grep mycal
-rw-r--r--. 1 root root 205 7月 22 16:47 mycal
[root@CentOS76 ~]# cat /tmp/mycal
2023年 07月 22日 星期六 16:47:00 CST
七月 2023
日 一 二 三 四 五 六
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
结论:
- 只要创建过at任务,不管是atrm删除、重启等,都会保留job标号。
at>
那一行,若写错字符需要按 ctrl+backspace 才能删除。