计划任务
计划任务,就是有计划的任务,就是按照我们的的计划自动执行任务
计划任务有一次性计划任务和周期性计划任务
一次性计划任务
所谓一次性计划任务,就是按照计划只执行一次的任务。
无论是windows还是Linux都具备一次性计划任务的功能。
Linux中的at命令是用来创建一次性计划任务的,t命令有一个服务atd会以后台模式运行,检査当前的时间来决定是否运行"计划"。
atd服务会检査系统上的一个特殊目录来获取at命令的提交的"计划",默认情况下,atd服务每60秒检査一次目录,有"计划"时,会检査"计划"运行时间,如果"计划运行"的时间与当前时间匹配,则运行此"计划"。
创建一次性计划任务,并执行
查看服务是否开启
bash
[root@bogon ~]# systemctl status atd
● atd.service - Deferred execution scheduler
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; preset: enabled)
Active: active (running) since Fri 2024-03-15 13:26:26 CST; 37min ago
Docs: man:atd(8)
Main PID: 970 (atd)
Tasks: 1 (limit: 22874)
Memory: 312.0K
CPU: 5ms
CGroup: /system.slice/atd.service
└─970 /usr/sbin/atd -f
Mar 15 13:26:26 bogon systemd[1]: Started Deferred execution scheduler.
编写备份yum仓库文件的脚本
bash
[root@bogon ~]# cat backup-repo.sh
#!/bin/bash
cp -r /etc/yum.repos.d /opt/yum-repo-backup-dir/yum.repos.d-`date "+%Y-%m-%d-%H:%M:%S"`.bak
设置权限
bash
[root@bogon ~]# chmod +x backup-repo.sh
执行计划任务
bash
[root@bogon ~]# at now
warning: commands will be executed using /bin/sh
at> /root/backup-repo.sh
at> <EOT>
job 9 at Fri Mar 15 15:02:00 2024
- -q:可以指定队列,队列有a-z总共26个队列
查看结果
bash
[root@bogon ~]# date ; ls /opt/yum-repo-backup-dir/
Fri Mar 15 03:02:33 PM CST 2024
yum.repos.d-2024-03-15-15:02:26.bak
一次性计划任务管理
执行一次性计划任务
bash
[root@bogon ~]# at now
warning: commands will be executed using /bin/sh
at> /root/backup-repo.sh
at> <EOT>
job 9 at Fri Mar 15 15:02:00 2024
-
at now
:后面跟任务执行的时间 -
at> /root/backup-repo.sh
:计划任务执行的任务脚本 -
Ctrl + d
:提交计划任务
计划任务执行时间的写法有很多方式
-
at now
:立即执行 -
at 5PM
:当天的5点执行,如果超过这个时间,会在第二天的这个时间执行 -
at 6:22
:当天的6:22
点执行,如果超过这个时间,会在第二天的这个时间执行 -
at 2024-03-03
:和at now
一样,立即执行 -
at 12:12 2024-03-03
:在2024年的3月3号12点12分执行 -
at 12:12 +5day
:在五天之后的12点12分执行
查看一次性计划任务
atq
bash
[root@bogon ~]# atq
3 Sat Mar 16 02:23:00 2024 a root
5 Sat Mar 16 02:26:00 2024 a root
6 Sat Mar 16 02:35:00 2024 a root
删除一次性计划任务
atrm at_id
bash
[root@bogon ~]# atrm 3
[root@bogon ~]# atq
5 Sat Mar 16 02:26:00 2024 a root
6 Sat Mar 16 02:35:00 2024 a root
查看一次性任务的详细信息
at -c at_id
bash
[root@bogon ~]# at -c 6
#!/bin/sh
# atrun uid=0 gid=0
...
一次性计划任务使用控制
bash
[root@bogon ~]# ls /etc/at.deny
/etc/at.deny
[root@bogon ~]# ls /etc/at.allow
ls: cannot access '/etc/at.allow': No such file or directory
在你的操作系统当中可能同时有多个用户在使用at命令设置一次性计划任务,那么你可以控制哪些用户可以使用计划任务,哪些用户不可以使用计划任务。
at一次性计划任务的白名单是at,a1low
,黑名单是at.deny
,不建议既使用黑名单,又使用白名单。建议使用白名单,白名单比黑名单力度要强。默认在rhel9
系统中默认是没有at.allow
文件的,可以自己创建。
at.allow的优先级是高于at.deny
周期性计划任务
周期性计划任务相比一次性计划任务来说相当于定制周期性的"计划"来执行某个任务,比如每分钟执行,每小时执行,每天执行,每周执行,每月执行,每天的03:88执行,每周三02:12执行,每月3号的84:16执行,每隔2分钟执行,每天的83:88,83:30执行等等
周期性计划任务的命令
-
crontab -e
:编辑当前shell用户的计划任务 -
crontab -e -u user
:编辑用户的计划任务,只有root用户才能编辑其他人的计划任务 -
crontab -l
:列出当前用户的所有计划任务 -
crontab -l -u
user:列出用户的计划任务
编辑计划任务的操作和vim
编辑文件一样
* * * * *
第一个星,代表分钟(0-59)。如果为 0 ,就代表每个小时的整点;默认为
*
,表示每分钟运行一次第二个星,代表小时(0-23)。如果为0,代表每天的0点;默认为
*
,表示每小时运行一次第三个星,代表日(1-31),如果为1,代表一个月的第一天;默认为
*
,表示每天运行一次第四个星,代表月(1-12),如果为1,代表一月份;默认为
*
,表示月运行一次第五个星,代表星期(0-6),如果为0,代表周天;默认为
*
,表示周运行一次
bash
# 一些计划任务格式实例
每分钟执行一次
* * * * * /root/x.sh
每小时的整点执行一次
0 * * * * /root/x.sh
每天凌晨1点准时运行
0 1 * * * /root/x.sh
每天凌晨1点这个小时中每分钟运行一次
* 1 * * * /root/x.sh
每月的第一天的每分钟运行一次
* * 1 * * /root/x.sh
1月份中每一天都执行
* * * 1 * /root/x.sh
每周周日的每一分钟,设置'周',尽量不要设置'日',容易产生歧义
* * * * 0 /root/x.sh
每五分钟一次
0/5 * * * * /root/x.sh
每两个小时运行一次,从0点开始
* 0/2 * * * * /root/x.sh
每小时的第1分钟和第10分钟运行一次,例如:03:01,03:10
1,10 * * * * /root/x.sh
每小时的第15分钟到20分钟每分钟运行一次,一个小时总共运行6次
15-20 * * * * /root/x.sh
每年4月到6月,即4月、5月、6月的10号和15号,从0点开始,每2个小时在第1分,第2分,第5分到第8分分别执行
1,2,5-8 0/2 10,15 4-6 * /root/x.sh
除了crontab -e
进行编辑计划任务,还可以在/etc/cronted
文件下面编写,还有cron.daily/、cron.hourly/、cron.monthly/、cron.weekly/
等目录下面,这种只能使用root
用户来编辑
bash
[root@bogon ~]# vim /etc/crontab
[root@bogon ~]# cd /etc/cron.daily/ ## 存放的是每天自动执行的脚本
[root@bogon ~]# cd /etc/cron.hourly/ ## 存放的是每小时自动执行的脚本
[root@bogon ~]# cd /etc/cron.weekly/ ## 存放的是每周自动执行的脚本
[root@bogon ~]# cd /etc/cron.monthly/ ## 存放的是每月自动执行的脚本
/etc/cron.d
目录下存放的文件格式和/etc/crontab
的格式是一样的,是一个扩展目录,默认情况下也会读取里面的周期计划任务
在/etc/
下有cron.deny
和cron.allow
对计划任务的用户实现控制,白名单要强于黑名单
-
cron.deny
:黑名单 -
cron.allow
:白名单
创建一个周期性计划任务
查看服务是否开启
bash
[root@bogon ~]# systemctl status crond.service
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; preset: enabled)
Active: active (running) since Fri 2024-03-15 13:26:26 CST; 2h 51min ago
Main PID: 971 (crond)
Tasks: 1 (limit: 22874)
Memory: 1.2M
CPU: 71ms
CGroup: /system.slice/crond.service
└─971 /usr/sbin/crond -n
Mar 15 14:21:01 bogon anacron[1722]: Job `cron.daily' terminated
Mar 15 14:21:01 bogon anacron[1722]: Normal exit (1 job run)
Mar 15 15:01:01 bogon CROND[2323]: (root) CMD (run-parts /etc/cron.hourly)
Mar 15 15:01:01 bogon run-parts[2326]: (/etc/cron.hourly) starting 0anacron
Mar 15 15:01:01 bogon run-parts[2332]: (/etc/cron.hourly) finished 0anacron
Mar 15 15:01:01 bogon CROND[2322]: (root) CMDEND (run-parts /etc/cron.hourly)
Mar 15 16:01:01 bogon CROND[2420]: (root) CMD (run-parts /etc/cron.hourly)
Mar 15 16:01:01 bogon run-parts[2423]: (/etc/cron.hourly) starting 0anacron
Mar 15 16:01:01 bogon run-parts[2429]: (/etc/cron.hourly) finished 0anacron
Mar 15 16:01:01 bogon CROND[2419]: (root) CMDEND (run-parts /etc/cron.hourly)
写一个脚本
bash
[root@bogon ~]# cat x.sh
#!/bin/bash
for i in {1..100}
do
echo $i >>/opt/num-`date "+%h-%H:%M:%S"`.txt
done
制作定时任务
bash
[root@bogon ~]# crontab -e
* * * * * /root/x.sh
每隔以分钟查看一次
bash
[root@bogon ~]# date;ls /opt/
Fri Mar 15 05:14:44 PM CST 2024
num-Mar-17:14:01.txt yum-repo-backup-dir
[root@bogon ~]# date;ls /opt/
Fri Mar 15 05:15:02 PM CST 2024
num-Mar-17:14:01.txt num-Mar-17:15:01.txt yum-repo-backup-dir
[root@bogon ~]# date;ls /opt/
Fri Mar 15 05:16:53 PM CST 2024
num-Mar-17:14:01.txt num-Mar-17:15:01.txt num-Mar-17:16:01.txt yum-repo-backup-dir
可以看到,每过一分钟,就会新添加一个文件