计划任务
工作当中有时候需要将某件事情在未来的某个特定的时间执行,而自己确不在机器旁,该如何是好?像这样在每天特定的时间内去安排做一些事情这样,一种事情我们就称之为例行性的计划任务,其实在我们的操作系统当中都有类似的例行性任务计划功能,那如何去像设定闹钟一种在Linux上指定例行性计划任务并实施,主要有两种工具:at和crontab
计划任务分类:
一次性的计划任务:只执行一次就结束
周期性的计划任务:每隔一定的周期去做相同的事情
一、 一次性计划任务
at用来专门处理一次性计划任务,crontab是根据用户自定义的时间内,循环的去做某些事情
at
at是由atd服务提供的,在6版本的系统上使用service atd start启动服务,7版本的系统上使用systemctl start atd启动服务(atd服务不起来,at计划是不工作的,at计划任务是依靠atd服务来工作运行的)
1.at使用方法
at [-V] [-q queue] [-f file] [-mMlbv] -c job [job…]TIME
-V:显示版本信息
-l:相当于atq,列出指定队列中等待运行的作业
-d n:相当于atrm,删除指定的作业
-c n:查看第n个具体作业任务
-f 把at要执行的所有任务放置于文件中,让at读取此文件作为要运行的任务,如at –f /root/a.txt
2.TIME的格式:定义什么时候进行at任务的时间
HH:MM 如12:00
在今天的HH:MM时刻进行,若该时间以过,则明天HH:MM进行此工作
HH:MM YYYY-MM-DD 如13:00 2016-09-01
强制规定在某年某月的某天的特殊时刻进行该工作
HH:MM[am|pm] [Mouth][Date]:如04pm March 10
强制在某年某月的某个时刻进行
HH:MM[am|pm] +number[minutes][hours][days][weeks]:如now+10minutes或04pm+3days,指在某个特定时间点再加某个时间点后才运行
3.模糊时间:
noon:正午
midnight:子夜
teatime:下午四点
4.执行方式
交互式(直接在命令执行at命令进入交互模式)
输入重定向
at –f 文件
依赖于atd服务,需要启动才能实现at任务
at队列存放在/var/spool/at目录中
通过/etc/at.allow /etc/at.deny控制用是否能执行at任务
首先寻找/etc/at.allow文件,文件中的使用才能使用at,没有在allow文件中的用户则不能使用at,如果某个用户即不在allow和deny文件中,那么只有root才能使用at,同理,在deny文件中的用户则不能使用at,不在deny 文件中的用户则可以使用at,如果两文件写了同一个用户,首先匹配allow即允许(默认at.allow文件不存在,需用户自己创建)
二、周期性计划任务
cron
相关程序包
cronie:主程序包,提供crond守护进程及相关辅助工具,自身是一个不间断运行的服务
cronie-anacron:cronie的补充程序;用于监控cronie任务执行状况,能够实现cronie的任务因为各种原因在过的时间该执行而未执行的任务恢复正常
crontabs:包含CentOS提供系统维护任务
确保crond守护处于运行状态
systemctl status crond 7版本的系统
service status crond 6及6以下版本的系统
计划周期性执行的任务交给crond,到指定时间会自动运行
(一) 系统cron任务:系统维护作业
/etc/crontab内容如下
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .—————- 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
五个字段字段的意思分别是分钟 小时 日 月 周
例如:凌晨4点备份/etc/目录下面的内容到/tmp下
0 4 * * * root tar zcf /tmp/etc.tar.gz /etc/
1.时间的有效取值
分钟 0-59
小时 0-23
日 1-31
月 1-12
周 0-7 0.7表示周日
2. 时间通配
* * 1 * * * 每月的1号执行某任务
特定值:给定时间有点取值范围内的值
离散取值
10,40 * * * * 每周每天每小时的第10分钟和第40分钟执行
连续取值:-
* * * * 1-5 周一到周五运行
3.在指定时间范围上定义步长
/#:#即为步长
*/3 * * * * 每三分钟执行
cron的环境变量,cron执行所有命令都去PATH环境变量指定的路径下去找
PATH /bin:/sbin:/usr/bin:/usr/sbin
4.时间格式
@rebootRun once after reboot. 重启后执行
@yearly0 0 1 1 *
@annually0 0 1 1 *
@monthly0 0 1 * *
@weekly0 0 * * 0
@daily0 0 * * *
@hourly0 * * * *
5.系统的计划任务
/etc/crontab
/etc/cron.d 配置文件
/etc/cron.hourly 每小时任务
/etc/cron.daily 每日任务
/etc/cron.weekly 每周任务
/etc/cron.monthly 每周任务
(二) anacron系统
运行计算机关机时cron不运行的任务,CentOS6以后版本取消anacron服务,由crond服务管理
假设计算机没有一直开机
对笔记本电脑、台式机、工作及其他不一直开机的系统很重要
对偶尔要关机的服务器很有用
配置文件:/etc/anacrontab,负责执行/etc/cron.daily /etc/cron.weekly /etc/cron.monthly中系统任务。/etc/cron.hourly由/etc/cron.d/0hourly执行
# /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
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
字段1:如果在这些日子里没有运行这些任务
字段2:在重新引导后等待这么多分钟后运行它
字段3:任务识别器,在日志文件中识别
字段1:要执行的任务
linux系统中管理临时文件
rhel6使用/etc/cron.daily/tmpwatch定时清除临时文件
rhel7使用systemd-tmpfiles-setup服务实现
配置文件:
/etc/tmpfiles.d/*.conf
/run/tmpfiles.d/*.conf
/usr/lib/tmpfiles/*.conf
/usr/lib/tmpfiles.d/tmp.conf
d /tmp 1777 root root 10d
d /var/tmp 1777 root root 30d
命令
system-tmpfiles –clean|remove|create configfile
(三) 用户计划任务管理
用户级别的周期性计划是通过crontab命令实现的,其也有对应的配置文件/var/spool/cron、目录中与用户名同名的文件中,可以通过crontab命令来指定任务计划
crontab命令(实则打开的是一个vim编辑器编辑里面的内容)
crontab [-u user] [-l | -r | -e] [-i] [-s]
-l:列出所有 任务
-e:编辑任务
-r:移除所有任务
-i:通-r一同使用,以交互式模式移除指定任务
-u user:仅root可运行,指定用户管理cron任务
控制用户执行计划任务
/etc/cron.allow(文件默认不存在) /etc/cron.deny
管理机制跟at相同
普通用户执行crontab具有suid权限,当root用户更改了普通用户的计划任务的属主为root,普通用户修改,文件被覆盖了,文件的属主又变成普通用户了
注意:运行结果的标准输出和错误以邮件通知给相关用户
command > /dev/null
command &> /dev/null
对于cron任务来讲,%有特殊用途,如果在命令中要使用%,则需要转义;不过,如果把%防止于单引号中,也可以不用转义
我们知道在计划当中最小单位是分钟,那我们实际工作中有时需要更精确的执行某项任务,需要达到秒级别的任务,那该如何实现呢,实则可以用循环的方式来执行如下:
* * * * * for min in 0 1 2 ;do echo “hi”;sleep 3;done
如何实现每7分钟运行一次任务
sleep命令
sleep number [SUFFIX]
SUFFIX:
s:秒,默认
m:fen
h:小时
d:天
1、 每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名形如“messages-yyyymmdd”
crontab -e
* * * * 2,4,7 tar -zcf /logs/messages-`date ‘+%F’` /var/log/messages
2、 每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中
* */2 * * * grep –Eo “^[sM].*” /proc/meminof >> /tmpmeminfo.txt
原创文章,作者:fszxxxks,如若转载,请注明出处:http://www.178linux.com/45121