Linux定时任务
为什么需要定时任务?
个人理解因为服务器通常在白天会比较繁忙,对于一些服务器的定期日常维护任务,比如数据库的备份、大数据的压缩等,这些操作都是非常耗费资源的,在白天执行或者说服务器繁忙的时候执行有可能导致服务器故障,所以使用定时任务 在深夜去执行比较合理。
还有一点就是对于一些日常维护工作,如果人为定时执行难免容易疏忽或者遗忘,而让系统定时执行则不存在这个问题。
at一次性定时任务
确定at安装
# at服务是否安装
chkconfig --list | grep atd
# at服务的启动
service atd restart
# 对于d结尾的服务,这里d代表daemon,守护进程,一般是作为系统服务
at的访问控制
- 如果系统中有
/etc/at.allow
文件,那么只有写入该文件(白名单)中的用户可以使用at
命令(/etc/at.deny
文件会被忽略) - 如果系统中没有
/etc/at.allow
文件,只有/etc/at.deny
文件,那么写入该文件(黑名单)中的用户不能使用at
命令,对root不起作用(系统默认有该文件而没有allow文件) - 如果系统中这两个文件都不存在,那么只有root用户可以使用
at
命令
at [选项] 时间
-m:
当at工作完成后,无论是否命令有输出,都用email通知执行at命令的用户-c 工作号:
显示该at工作的实际内容时间文章图片
atq
#查询当前服务器上的at工作atrm [工作号]
#删除指定的at任务命令示例 1.在两分钟之后执行hello.sh脚本,在at提示符输入具体的任务后:/root/hello.sh,按
ctrl + d
保存并退出通过
atq
查看该定时任务,通过 at -c 1
查看该任务内容[root@localhost ~]# at now +2 minutes
at> /root/hello.sh
at>
job 1 at 2019-03-09 22:51
2.在指定的时间重启服务器(生产环境不建议)
[root@localhost ~]# at 02:00 2019-03-10
at> /bin/sync
at> /sbin/shutdown -r now
crontab循环定时任务 crond服务管理
chkconfig --list | grep crond#确认是否安装该服务
service crond status#确认服务是否开启
chkconfig crond on#设置自启动
yum -y install vixie-cron crontabs#安装cron服务
访问控制
- 当系统中有
/etc/cron.allow
文件时,只有写入此文件的用户可以使用crontab
命令,如果有此文件,/etc/cron.deny
文件会被忽略 - 当系统中只有
/etc/cron.deny
文件时,则写入此文件的用户不能使用crontab
命令
crontab [选项]
-e:
编辑crontab定时任务-l:
查询crontab任务-r:
删除当前用户所有的crontab任务注意事项
- 编辑任务其实是在vim编辑器中进行,所以如果只想删除某个指定的定时任务,直接编辑crontab,删除该行命令即可
- 执行
crontab
命令会将当前用户登录的身份绑定在crontab
命令中,也就是说用户执行的任务不能超出当前用户的权限
crontab -e
命令会打开vim编辑你的工作任务具体格式是:* * * * * 执行的任务
文章图片
特殊符号的含义
文章图片
示例
文章图片
简单演示
# 测试定时任务,每1分钟输出一句话到文件中
*/1 * * * * echo "silly" >> test.log
# 每周二5点5分重启服务器,仅测试(不推荐定时重启,容易出错)
5 5 * * 2 /sbin/shutdown -r now
# 每月1,10,15号凌晨5点整执行备份脚本
0 5 1,10,15 * * /root/sh/autobak.sh
格式注意事项
- 六个选项都不能为空,必须填写。如果不确定使用
“*”
代表任意时间 - crontab定时任务,最小有效时间是分钟,最大时间范围是月,像2018年某时执行,3点30分30秒这样的时间都不能识别
- 在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都是以天作为单位,非常容易让管理员混乱
- 在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都是用绝对路径(因为定时任务有定义自己的PATH)
"crontab -e"
是每个用户执行的命令,也就是说不同的用户身份可以执行自己的定时任务。可是有些定时任务需要系统执行,这时我们就需要编辑 /etc/crontab
这个配置文件了vim /etc/crontab
# 文件内容如下,默认仅定义了一些变量
# 使用标准的bash作为定义任务执行shell
SHELL=/bin/bash
# 定时任务使用的PATH环境变量
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# 如果定时任务发生了任何报错或者出现提示,都会向root用户发送邮件
MAILTO=root
# 标识主目录
HOME=/
# 以下内容都是注释内容,说明了定义定时任务的格式,需要额外指定用户名
# .---------------- minute (0 - 59)
# |.------------- hour (0 - 23)
# ||.---------- day of month (1 - 31)
# |||.------- month (1 - 12) OR jan,feb,mar,apr ...
# ||||.---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |||||
# ***** user-name command to be executed
CentOS 5中的配置文件 在centos5中该配置文件除了基本变量定义外,还包含了以下内容
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
也就是说centos5这4个目录
/etc/cron.***
下的文件会按指定规则定时执行,只需将脚本拷贝到这些目录下即可。这样的好处是不需要自己手工指定定时任务的规则了,而且进入相应的目录就能看到系统需要执行哪些定时任务。
即使在CentOS 6中这几个目录的功能依然生效,只是centos6以后使用
anacron
来取代管理。执行定时任务方法
- 通过
crontab -e
手工执行 - 系统定时任务
① 把需要定时执行的脚本复制到/etc/cron.{hourly,daily,weekly,montly}
目录中的任意一个
② 修改/etc/crontab
配置文件,添加需要执行的任务
anacron检测周期
- anacron会使用一天,七天,一个月作为检测周期
- 在系统的
/var/spool/anacron/
目录中存在cron.{daily,weekly,monthly}
文件,用于记录上次执行cron的时间 - 和当前时间做比较,若果两个时间的差值超过了anacron的指定时间差值,证明有cron任务被漏执行
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 指定延迟是为了保证目录下的脚本不会同时执行,错开时间避免造成服务器过大压力
# 最大随机延迟
RANDOM_DELAY=45
# anacron的执行时间范围是3:00 - 22:00
START_HOURS_RANGE=3-22#天数 强制延迟(分)工作名称实际执行的命令
15cron.dailynice run-parts /etc/cron.daily
725cron.weeklynice run-parts /etc/cron.weekly
@monthly 45cron.monthlynice run-parts /etc/cron.monthly
执行过程 【Linux定时任务】以
cron.daily
工作来说明执行过程- 首先读取
/var/spool/anacron/cron.daily
中的上一次anacron执行的时间 - 和当前时间比较,如果两个时间的差值超过1天,就执行cron.daily工作(准备执行)
- 执行这个工作只能在03:00-22:00之间
- 执行工作时强制延迟时间为5分钟,再随机延迟0-45分钟时间
- 使用nice命令指定默认优先级,使用
run-parts
脚本(命令)执行/etc/cron.daily
目录中的所有可执行文件
- anacron最小检测周期是天,使用anacron管理的定时任务应该最小是每隔一天执行
- 将需要定时执行的脚本拷贝到
/etc/cron.{daily,weekly,monthly}
目录下即可被anacron管理 - 使用anacron优点是全自动执行,不用人为干预和配置,缺点是执行时间不可控制
- 可以将定时任务(天周期及以上)手工指定或系统crontab配置,同时放到anacron管理目录下做双重保障
-
cron.hourly
由/etc/cron.d/0hourly
调用,所以放在该目录下的脚本也会生效
推荐阅读
- Linux下面如何查看tomcat已经使用多少线程
- Beego打包部署到Linux
- 多线程NSOperation
- Linux|109 个实用 shell 脚本
- linux定时任务contab
- 芯灵思SinlinxA33开发板Linux内核定时器编程
- 242为什么不断切换任务会更容易累()
- day16-Linux|day16-Linux 软件管理
- 如何在阿里云linux上部署java项目
- mac|mac 链接linux服务器 如何在Mac上连接服务器