linux 计划任务
文章目录
一、一次性计划任务
- at是定时任务工具,依赖于atd服务,适用于执行一次就结束的调度任务
- 例如: 凌晨3点需要临时备份数据文件等,可以使用到at
- 要想使用at一次性计划任务时,Linux系统上面必须要有负责这个计划任务的服务,就是atd服务
- 有些Linux版本默认不会打开,需要手动打开激活服务
1、安装atd服务,设置开机自启动
[root@smx ~]# yum -y install at
[root@smx ~]# systemctl restart atd
[root@smx ~]# systemctl enable atd
2、at的使用
语法格式
at HH:MM yyyy-mm-dd
> command
> Ctrl+D
或
at HH:MM yyyy-mm-dd -f filename #文件必须是可执行权限,而且应该写绝对路径
参数 | 解释 |
---|---|
-m | 当指定的任务被完成之后,将给用户发送邮件,即使没有标准输出 |
-I | atq的别名 atq at -l |
-d | atrm的别名 rm delete atrm = at -d |
-v | 显示任务将被执行的时间 |
-c | 打印任务的内容到标准输出 |
-V | 显示版本信息 |
-q | 使用指定的列队 |
-f | 从指定文件读入任务而不是从标准输入读入 |
-t | 以时间参数的形式提交要运行的任务 |
一分钟后打印
[root@smx ~]# at now+1min
at> echo "smx"
at> <EOT>
job 1 at Sat Jan 13 12:41:00 2024
明天17点,创建一个文件,把当前时间写进去
[root@smx ~]# at 17.00 tomorrow
at> date > time.txt
at> <EOT>
job 2 at Sun Jan 14 17:00:00 2024
查看at计划任务
[root@smx ~]# atq
2 Sun Jan 14 17:00:00 2024 a root
3 Sat Jan 13 12:45:00 2024 a root
删除at计划任务
[root@smx ~]# atrm 2
以文件形式设置计划任务
必须文件有执行权限
[root@smx ~]# at 14:36 2024-10-1 -f /root/at.sh
3、at工作模式
-
默认目录:
/var/spool/at/
-
每创建一个at计划任务默认就会在/var/spool/at/目录里创建一个文件,文件以a开头的,当任务执行完毕后,文件也随之消失。
at安全控制
at利用/etc/at.allow和/etc/at.deny 这两个文件来限制权限,默认是所有用户都可以使用at,如果不希望哪个用户使用,将用户写入到/etc/at.deny文件中
不允许smx01用户使用at
[root@smx ~]# vim /etc/at.deny
smx01
[root@smx ~]# su - smx01
[smx01@smx ~]$ at
You do not have permission to use at.
二、周期性计划任务cron
确认服务开启,没有服务就yum -y install crond
[root@smx ~]# systemctl restart crond.service
[root@smx ~]# systemctl enable crond.service
cron任务分为两类
系统定时任务
- 系统定时配置文件解析 /etc/crontab
[root@smx home]# cat /etc/crontab
SHELL=/bin/bash # 指定shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin # 指定了系统可执行文件路径
MAILTO=root # 指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务 执行信息给用户
....
用户定时任务
- 用户定期要执行的工作,比如用户数据备份、定时邮件提醒等
crontab 命令
- crontab命令被用来提交和管理用户的需要周期性执行的任务,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务
- crontab 建立计划任务会存放在 /var/spool/cron/ 目录中,
- crontab 安全控制
- /etc/cron.allow: 将可以使用 crontab 的账号写入其中,若不在这个文件内的用户则不可使用 crontab;
- /etc/cron.deny: 将不可以使用 crontab 的账号写入其中,若未记录到这个文件当中的用户,就可以使用 crontab 。
- 与 at 一样,以优先级来说, /etc/cron.allow 比 /etc/cron.deny 要高, 一般系统默认是提供 /etc/cron.deny , 你可以将不允许使用 crontab 用户写入 /etc/cron.deny 当中,一个账号一行。
crontab 的使用
1、crontab 语法
- crontab (选项) (参数)
选项 | 解释 |
---|---|
-e | edit编辑定时任务 |
-l | list查看定时任务 |
-r | 删除定时任务,移除/var/spool/cron/username文件 |
-u | 指定用户执行任务,root可以管理普通用户的计划任务 |
-i | 删除定时任务,提示用户确认删除,避免出错 (交互式删除) |
- 参数: crontab文件:指定包含待执行任务的crontab文件
/var/spool/cron/ 所有用户crontab文件存放的目录,以用户名命名
2、编辑crontab 文件
[root@smx ~]# crontab -e
* 12 * * * user1 cp /etc/passwd /root
分 时 日 月 周 指定用户 执行的任务
特殊字符 | 含义 |
---|---|
*(星号) | 代表任何时刻 |
,(逗号) | 代表分隔时段的意思。如3:00 与 6:00 时,就是:0 3,6,9 * * * |
-(减号) | 代表一段时间范围内,如:8 点到 12 点之间的每小时的 20 分都进行一项工作:20 8-12 * * * |
/n(斜线) | n 代表数字,间隔的单位的意思,如每五分钟进行一次,则:*/5 * * * * 0 */1 * * * |
crontab 系统配置文件
/etc/crontab #系统计划任务的配置文件,主配置文件
/etc/cron.d/ #是系统自动定期需要做的任务,但是又不是按小时,按天,按星期,按月来执行的,那么就放在这个目录下面。
/etc/cron.hourly/ #每小时执行的脚本
/etc/cron.daily/ #每天执行的脚本
/etc/cron.weekly/ #每周执行的脚本
/etc/cron.monthly/ #每月执行的脚本
/var/spool/cron/* #用户定制的计划任务存放位置
注意:
1、如果只是要删除某个任务,使用 crontab -e 来重新编辑,如果使用 -r 的参数,是会将所有的 crontab 内容都删掉。
2、crontab -e 进入脚本编辑,一行就表示一个计划任务,需要多少个计划任务就写多少行。
3、命令必须使用绝对路径来表示,如:/bin/bash mysql_back.sh 使用which 命令 或 whereis 命令 来定位命令的绝对路径
4、书写计划任务时,命令的标准输出或错误输出都是不会直接输出到屏幕上的,如:*/1 * * * * date 此计划任务将不会输出日历都屏幕上,正确的写法应该是重定向到文件
计划任务的日志文件
- 默认日志文件位置:
/var/log/cron /var/log/cron-xxxxxxxx
- /var/log/cron 就是当天的计划任务日志,
- 日志文件以cron开头后面接日期则是之前的日志,查看该日志文件可以得知计划任务是否执行成功
crontab与% 问题
%在crontab中属于特殊字符,所以在书写crontab命令时如果需要使用使用%,请使用反斜杠\将百分号转译,如:
* * * * * /usr/bin/tar -zcf /tmp/etc-$(date +"\%Y\%m\%d\%H\%M\%S").tar.gz /etc #或者下面这样把命令写在文件里
* * * * * sh /root/tar_etc.sh #tar_etc.sh正常写脚本内容:/usr/bin/tar -zcf /tmp/etc-$(date +"%Y%m%d%H%M%S").tar.gz /etc
特定时间执行任务案例
时间 | 含义 |
---|---|
45 22 * * * | 在22点45分执行命令 |
0 17 * * 1 | 每周一的17点0分执行命令 |
0 5 1,15 * * | 每月1号和15号的早上五点执行命令 |
40 4 * * 1-5 | 每周一到周五早上四点四十分执行命令 |
*/10 4 * * * | 每天早上四点,每隔十分钟hi i选哪个一次命令 |
0 0 1,15 * 1 | 每月1号和15号,每周一的凌晨0点0分都会执行命令 |
案例
- 每天 22:00 备份/etc/目录到/tmp/backup 下面
- 将备份命令写入一个脚本中
- 每天备份文件名要求格式: 2023-08-19_etc.tar.gz
- 在执行计划任务时,不要输出任务信息
- 存放备份内容的目录要求只保留三天的数据
===========================
[root@smx ~]# mkdir /tmp/backup
[root@smx ~]# tar zcf etc.tar.gz /etc
[root@smx ~]# find /tmp/backup -name “*etc.tar.gz” -mtime +3 -exec rm -rf {}\;
===========================
[root@smx ~]# crontab -l
0 22 * * * /root/backup.sh & > /dev/null
[root@smx ~]# cat backup.sh
#!/bin/bash
find /tmp/backup -name "*.tar.gz" -mtime +3 -exec rm -f {}\;
tar zcf /tmp/backup/`date +%F`_etc.tar.gz /etc
三、计划任务的定时任务 anacron(了解)
1、什么是 anacron
-
anacron 并不是用来取代 crontab 的,anacron 存在的目的就在于处理由于一些原因导致cron无法完成的工作
-
anacron 每个小时被 crond 执行一次,然后 anacron 再去检测相关的工作任务有没有被执行,如果有未完成的工作, 就执行该工作任务,执行完毕或无须执行任何工作时,anacron 就停止了。我们可以通过/etc/cron.d/0hourly的内容查看到
[root@smx ~]# cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly
关机3天 crontab 三天内计划任务没有执行 第4天开机了
由于 anacron 默认会以一天、七天、一个月为期去检测系统未进行的 crontab 任务,因此对于某些特殊的使用环境非常有帮助。
anacron 会去分析现在的时间与时间记录文件 (timestamps) 所记载的上次执行 anacron 的时间,两者比较后若发现有差异, 确认在某些时刻没有进行 crontab !此时 anacron 就会开始执行未进行的 crontab 任务
2、anacron 与 /etc/anacrontab
- anacron 是一个程序并非一个服务!
- anacron 程序在系统当中已经加入 crontab 的工作!同时 anacron 会每个小时被主动执行一次!所以 anacron 的配置文件放置在 /etc/cron.hourly目录中
[root@smx ~]# cat /etc/cron.hourly/0anacron
#!/bin/sh
# Check whether 0anacron was run today already
.
.
.
/usr/sbin/anacron -s
实际上,也仅仅是执行anacron -s命令,这个命令会根据/etc/anacrontab文件的定义去执行各项工作
3、anacrontab
[root@smx ~]# cat /etc/anacrontab
# /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
1 10 cron nice run-parts /var/spool/cron
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
间隔时间(天) 延迟时间(分钟) 工作名称 执行的内容
-
以 /etc/cron.daily/ 那一行的为例
-
每隔一天,在开机后的第5分钟去执行cron.daily目录下的脚本