Linux 系统计划任务管理详解
在Linux操作系统中,除了用户即时执行的操作命令外,还可以配置在指定的时间,指定的日期执行预先计划的系统管理任务(如定期备份、定期采集检测数据)。CentOS系统默认已安装了at、cronie软件包,通过atd和crond这两个系统服务实现一次性、周期性计划任务的功能,分别通过at、crontab命令进行计划任务设置。
一、at一次性任务设置
使用at命令设置的计划任务只在指定的时间执行一次,前提是对应的系统服务atd必须已经运行。需要注意的事,计划任务的时间,日期必须安排在当前系统时间之后,否则无法正确的设置计划任务。
使用at设置一次性计划任务,需要检查两个配置:
首先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即使没有写在 at.deny 当中); 如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用者,就可以使用 at 咯; 如果两个文件都不存在,那么只有 root 可以使用 at 这个指令。
通过这个说明,我们知道 /etc/at.allow 是管理较为严格的方式,而 /etc/at.deny 则较为松散 (因为帐号没有在该文件中, 就能够执行 at 了)。在一般的 distributions 当中,由于假设系统上的所有用户都是可信任的, 因此系统通常会保留一个空的 /etc/at.deny 文件,意思是允许所有人使用 at 指令的意思 。 不过,万一你不希望有某些使用者使用 at 的话,将那个使用者的帐号写入 /etc/at.deny 即可! 一个帐号写一行。
设置一次性任务的时候,在at命令行中依次指定执行任务的时间、日期作为参数(若只指定时间则表示当天的时间,若只指定日期则表示该日期的档期时间)确认后将进入“at>”提示符的任务编辑页面,每行设置一条执行命令,可以一次设置多条语句,最后按Ctrl+D组合键提交任务。
at:指定时间点,执行一次性任务,用法如下
at 命令:at [option] TIME
常用选项:
-V 显示版本信息 -t time 时间格式 [[CC]YY]MMDDhhmm[.ss] -l 列出指定队列中等待运行的作业;相当于atq -d 删除指定的作业;相当于atrm -c 查看具体作业任务,后面跟任务队列中的任务编号ID -f /path/file 指定的文件中读取任务 -m 当任务被完成之后,将给用户发送邮件,即使没有标准输出 TIME:定义具体执行at这项任务的时间点,TIME格式如下: HH:MM [YYYY-mm-dd] noon, midnight, teatime(4pm) tomorrow now+#{minutes,hours,days, OR weeks} TIME时间格式举例如下: HH:MM 02:00 在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务 HH:MM YYYY-MM-DD 02:00 2016-09-20 规定在某年某月的某一天的特殊时刻进行该项任务 HH:MM[am|pm] [Month] [Date] 04pm March 17 17:20 tomorrow 在某个时间点再加几个时间后才进行该项任务 HH:MM[am|pm] + number [minutes|hours|days|weeks] now + 5 min 02pm + 3 days
at任务的创建方式有如下几种:
1)交互式 #输入at命令与系统交互式创建 2)输入重定向 #采用管道符"|" 或者"<" 输入重定向创建 3)at -f 文件 #使用-f选项后面跟指定的文件的方式来创建
例子:
[root@localhost ~]# date //查询时间 Sun Sep 8 13:39:14 CST 2019 [root@localhost ~]# at 13:41 2019-9-8 //指定时间设置任务 at> pgrep -U root | wc -l > /tmp/ps.root //统计改时间点root用户运行的进程数量,保存到/tmp/ps.root文件中 at> <EOT> //任务设置完毕后,按Ctrl+D组合键提交任务 job 3 at Sun Sep 8 13:41:00 2019 [root@localhost ~]# cat /tmp/ps.root 132 //时间过后,查看执行效果
例子2:
[root@localhost ~]# at 22:00 2019-9-8 at> shutdown -h now at> <EOT> job 4 at Sun Sep 8 22:00:00 2019 //在2019年9月8号晚上22:00关闭系统
举例:创建定时任务,今天18:00自动关机
[root@centos7 ~]#at 18:00 at> shutdown -p at> <EOT> #按Ctrl+D键正常结束输入 job 4 at Thu Aug 22 18:00:00 2019 查看创建的at任务列表 [root@centos7 ~]#at -l #或者使用atq命令 4 Thu Aug 22 18:00:00 2019 a root [root@centos7 ~]# 查看指定任务的具体信息 [root@centos7 ~]#at -c 4 #4为指定任务的编号ID 删除at任务 [root@centos7 ~]#at -d 4 或者 [root@centos7 ~]#atrm 4
对于已经设置但还未执行的计划任务,可以通过“atq”命令进行查询。但是已经执行过的at任务将不会显示在列表中,如下:
[root@localhost ~]# atq 4 Sun Sep 8 22:00:00 2019 a root
若要删除指定编号的at任务,可以使用“atrm”命令。删除后的at任务将不会被执行,并且不会显示在atq命令的显示结果中,但已经执行过的任务无法删除。
[root@localhost ~]# atq 4 Sun Sep 8 22:00:00 2019 a root [root@localhost ~]# atrm 4 //删除第4条at计划任务 [root@localhost ~]# atq
batch:系统自行选择空闲时间去执行此处指定的任务 (此类计划任务由于执行时间不确定,所以使用相对较少)
举例:创建任务,在系统空闲的时候,自动将/data目录下的f1.log压缩
[root@centos7 ~]#batch at> gzip /data/f1.log at> <EOT> #Ctrl+D 正常退出完成任务输入
仅执行一次的工作调度:
其实 batch 是利用 at 来进行指令的下达啦!只是加入一些控制参数而已。这个 batch 神奇的地方在于:他会在 CPU 的工 作负载小于 0.8 的时候,才进行你所下达的工作任务啦! 那什么是工作负载 0.8 呢?
这个工作负载的意思是: CPU 在单一时间点所 负责的工作数量。不是 CPU 的使用率。
可以使用“uptime”命令,查看cpu的负载情况!
at与batch命令创建的计划任务默认存放在 /var/spool/at 目录下
注意:at与batch命令依赖atd服务,需确保系统atd服务处于运行状态
二、crontab周期性的任务设置
使用crontab命令设置的计划任务可以按预设的周期重复执行,从而大大减轻设置重复性系统管理任务的操作。启用周期性任务也有一个前提条件,即对应的系统服务crond必须运行。
(1)crontab的配置文件和目录
crontab通过多个目录和文件设置计划任务,不同类型的任务由不同的配置文件来设置。
修改以下相关配置文件,或将需要添加计划任务的脚本放入到以下对应的目录中
/etc/crontab 配置文件 /etc/cron.d/ 配置文件 /etc/cron.hourly/ 脚本 /etc/cron.daily/ 脚本 /etc/cron.weekly/ 脚本 /etc/cron.monthly/ 脚本
1)/etc/crontab——系统任务配置文件
/etc/crontab文件中设置的是维护Linux操作系统所需的任务,Linux操作系统及相关程序在安装时可自动设置,不建议用户手动修改此文件。文件内容如下:
[root@localhost ~]# cat /etc/crontab SHELL=/bin/bash //使用哪种shell接口 PATH=/sbin:/bin:/usr/sbin:/usr/bin //可执行文件搜寻路径 MAILTO=root //若失败,将email发送给root # 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
文件中包括设置shell环境、可执行路径等变量的操作,以及每小时、每天、每月需要制定的任务目录。
根据 /etc/crontab配置文件中的设定,crond将按照不同的周期重复执行相应目录中的任务脚本文件。
2)/var/spool/cron——用户cron任务的配置文件存放目录
由用户自行设置(使用crontab命令)的cron计划任务会被保存到目录/var/spool/cron中,文件名与用户名相同。
crond守护进程会自动检查/etc/crontab文件、/etc/cron.d目录及/var/spool/cron目录中的改动,如果发现有配置更改,他们就会被载入内存,所以当会被载入内存,所以当某个crontab文件改动后并不需要重新启动,crond守护进程就可以使设置生效。
cron任务创建后,任务队列存放在每个用户专用的cron任务目录下 /var/spool/cron/USERNAME
cron任务的日志文件位于 /var/log/cron
(2)使用crontab命令管理用户的计划任务
设置用户的周期性计划任务列表主要通过crontab命令进行,结合不同的选项可以完成不同的计划任务管理操作。
常用的选项有:
-e:编辑计划任务列表; -u:制定所管理的计划任务属于哪个用户,默认是针对当前用户,一般只有root用户有权限使用此选项(用于编辑、删除其他用户的计划任务)。 -l:列表显示计划任务; -r:删除计划任务列表。
1)编辑用户的计划任务列表
执行“crontab -e”命令后,将打开计划任务编辑界面(与vi中的操作相同)。通过该界面用户可以自行添加具体的任务配置,每行代表一个记录。配置格式,
┌───────────── 分钟(0 - 59) │ ┌───────────── 小时(0 - 23) │ │ ┌───────────── 天 (1 - 31) │ │ │ ┌───────────── 月 (1 - 12) │ │ │ │ ┌───────────── 周几 (0 - 6) (周日到周六,其中周日可以用0或7表示) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * * * * *
如图:
还可以使用一些特殊的符号:
* 星号 表示任意值 ,逗号 表示多个值,例如 1,2,3 - 连字符 表示连续的范围,例如3-6,代表3,4,5,6 / 斜线 表示在指定的时间范围上,定义步长,注意,定义的步长的值,对应字段的值需要能整除,例如在分钟字段,*/5,表示每5分钟,对应的执行任务的时刻点为0 5 10 15 20 25 30 35 40 45 50 55,如不能整除则无效,例如分钟字段不能设置为7(因为60不能被7整除) L 表示最后(last),比如在周那个字段的6L表示某一个月的最后一个周六。
常用的cron表达式举例:
每小时
0 * * * *
每2小时
* */2 * * *
每个月的10号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 10 * 1-3
每天的下午2点从1分到40分的每分钟
1-40 14 * * *
每天的早上8点到下午4点,每隔两个小时
0 8-16/2 * * *
每年3月到6月份,每个月的1号、10号、20号,或者每个月的星期天
* * 1,10,20 3-6 0
例如:
[root@localhost ~]# crontab -e
50 7 * * * /usr/bin/systemctl start sshd
//每天7点50自动开启ssh服务
0 0 */5 * * /usr/bin/rm -rf /var/ftp/pub/*
//每隔5天清空一次FTP服务器的公共目录的数据
因各种计划任务在执行时不需要用户登录,所以计划任务配置记录中的命令建议使用绝对路径,以避免因缺少执行路径和无法执行命令的情况。
cron任务注意事项:
1、在同时存在日期字段和星期字段的表达式中,日期和星期在条件匹配上是或者的关系,只要满足其中一个条件,计划任务就会执行,其他字段为并且的关系,需要同时满足才执行。
2、运行结果的标准输出和错误默认会以邮件通知给相关用户,如不希望产生大量邮件,需要将命令的输出做重定向处理,例如:
COMMAND &> /dev/null
3、对于cron任务来讲,%有特殊用途;如果在命令中要使用%,则需要转义,将%放置于单引号中,则可不用转义,或者将命令写入脚本文件中。
2)查看用户的计划任务列表
crontab命令结合“-l”选项可以查看当前用户的计划任务列表,对于root用户来说,还可以结合“-u”选项查看其它用户的计划任务。操作如下:
[root@localhost ~]# crontab -l //查看用户root自己的计划任务 50 7 * * * /usr/bin/systemctl start sshd 0 0 */5 * * /usr/bin/rm -rf /var/ftp/pub/* [root@localhost ~]# crontab -l -u lisi //查看用于lisi的计划任务
3)删除用户的计划任务列表
当只需要删除某一条计划任务是,可以通过“crontab -e”命令进行编辑;而若要清空某个用户的所有计划任务时,可以使用“crontab -r”命令。
[root@localhost ~]# crontab -r //清空当前用户设置的计划任务 [root@localhost ~]# crontab -l no crontab for root
在设置用户的crontab计划任务的过程中,由于每一条记录只能运行一条命令,难以完成更复杂的系统管理任务操作,因此在实际环境中,当需要按照固定周期运行一些操作复杂的任务时,通常是将相关命令编写成脚本,然后在计划任务配置中加载该脚本并执行。
4)可唤醒停机期间的工作任务——anacron
由于 anacron 默认会以一天、七天、一个月为期去侦测系统未进行的 crontab 任务,因此对于某些特殊的使用环境非常有 帮助。 举例来说,如果你的 Linux 主机是放在公司给同仁使用的,因为周末假日大家都不在所以也没有必要打开, 因此你的 Linux 是周末都会关机两天的。但是 crontab 大多在每天的凌晨以及周日的早上进行各项任务, 偏偏你又关机了,此时系统很多 crontab 的任务就无法进行。 anacron 刚好可以解决这个问题!
那么 anacron 又是怎么知道我们的系统啥时关机的呢?这就得要使用 anacron 读取的时间记录文件 (timestamps) 了! anacron 会去分析现在的时间与时间记录文件所记载的上次执行 anacron 的时间,两者比较后若发现有差异, 那就是在某些时刻没 有进行 crontab 啰!此时 anacron 就会开始执行未进行的 crontab 任务了!
anacron指令常用的参数:
注意:
基本上,crontab 与 at 都是“定时”去执行,过了时间就过了!不会重新来一遍~
那 anacron 则是“定期”去执行,某一段周期的执行 ~ 因此,两者可以并行,并不会互相冲突啦!
查看任务是否执行。
使用tail -f /var/log/cron命令来实时查看计划任务的执行日志。该命令会显示计划任务的执行情况,包括执行时间和执行结果。
参考:https://blog.51cto.com/14157628/2375002
https://www.cnblogs.com/eddie1127/p/11394678.html