linux 计划任务at和cron

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当指定的任务被完成之后,将给用户发送邮件,即使没有标准输出
-Iatq的别名 atq at -l
-datrm的别名 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 (选项) (参数)
选项解释
-eedit编辑定时任务
-llist查看定时任务
-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目录下的脚本

  • 42
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习运维的欣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值