【讲清楚,说明白!】计划任务crontab及企业实战应用

目录:
(一)at计划任务
(二)crontab计划任务
(三)清理临时文件


经验丰富的系统运维工程师可以使得Linux系统在无需人工介入的情况下,在指定的时间段自动启动或停止某些服务或命令,从而实现运维的自动化。尽管我们现在已经有了功能强大的脚本程序来执行一些批处理工作,但是如果仍然需要在每天凌晨两点敲击键盘回车键来执行这个脚本程序,这简直太痛苦了。所以这就使得我们能掌握如何设置服务器的计划任务服务的方法,并拥有把周期性,规律性的工作交给系统自动完成的技能显得尤为重要。
计划任务分为一次性计划任务与周期性计划任务。例如公司人事写了一封放假邮件,计划是在放假前最后一个工作日的上午10点发送全体员工,此时我们所需要的就是一次性计划任务。再如数据库管理员需要在每天凌晨2点对业务数据库进行备份,此时我们所需要的就是通过周期性计划任务解决这个需求。
(一)at计划任务
(1.1)at是属于一次性计划任务,顾名思义,一次计划任务只执行一次,一般用于满足临时的工作需求。我们可以使用at命令实现这种功能,只需要写成“at 时间”的格式就可以了。如果想要查看已设置好但还未执行的一次性计划任务,可以使用“at -l”命令;想要将其删除,可以使用“atrm 任务序号”。在使用at命令来设置一次性计划任务时,默认采用的是交互式方法。
(1.2)第一个使用“atq”或者“at -l”可以来查看当前系统中所有的计划任务的列表情况。
# atq
# at -l
【讲清楚,说明白!】计划任务crontab及企业实战应用
(1.3)对于at命令的用法,我们可以通过“man at”命令来查看。现在我们的需求是创建一个2019年10月27日的计划任务(当前是26日),则我们可以查询到符合自己使用习惯的日期表示方式,比如编辑在10月27日执行重启httpd服务的计划任务。需要注意的是,我们当前的时间是几点,那么创建的计划任务所执行的时间,也就是我们所指定的那个日期与当前的时间点一致的时候执行。因为我们是在2019年10月26日的20点01分创建的计划任务,所以计划任务执行的时间是2019年10月27日的20点01分。
# at 2019-10-27
at> systemctl restart httpd
【讲清楚,说明白!】计划任务crontab及企业实战应用
【讲清楚,说明白!】计划任务crontab及企业实战应用
(1.4)在创建指定时间的计划任务时,我们也是可以指定具体的时间的,精确到时、分。
# at 22:00 2019-12-12---创建一个计划任务,设定在2019年12月12日22:00分执行
# at 4pm 2019-12-12---创建一个计划任务,设定在2019年12月12日下午4点执行
【讲清楚,说明白!】计划任务crontab及企业实战应用
(1.5)如果我们想指定3周后下午4点执行重启http服务的指令,则可以使用weeks参数;如果我们想要3天后的上午4点执行重启http服务的指令,则可以使用days参数;如果我们想指定2个小时后执行重启http服务的指令,则可以使用hours参数;如果我们想指定1小时后执行删除/root/目录下所有以rpm为后缀的文件,则可以使用minutes参数。
# at 4pm + 3weeks
at> systemctl restart httpd
# at 4am + 3days
# at now + 2hours
# at now + 1minutes
at> rm -rf /root/*rpm
【讲清楚,说明白!】计划任务crontab及企业实战应用
(1.6)如果我们想查询具体的计划任务的信息,可以使用两种方式进行查看,第一种是使用“at -c”命令查询(图1-6和图1-7);第二种是进入到/var/spool/at目录下进行查看计划任务的具体内容(图1-8和图1-9)。
# at -c 1
# cd /var/spool/at
【讲清楚,说明白!】计划任务crontab及企业实战应用
【讲清楚,说明白!】计划任务crontab及企业实战应用
【讲清楚,说明白!】计划任务crontab及企业实战应用
【讲清楚,说明白!】计划任务crontab及企业实战应用
(1.7)如果我们现在需要将多余的计划任务删除,则可以使用“atrm”命令或者是“at -d”命令。如果我们希望批量删除指定的计划任务,则可以使用
# atrm 1---删除第一个计划任务
# at -d 2---删除第二个计划任务
# atrm {3..6}---删除第3到第6个计划任务
【讲清楚,说明白!】计划任务crontab及企业实战应用
【讲清楚,说明白!】计划任务crontab及企业实战应用
(1.8)默认情况下,系统中的普通用户是可以执行计划任务的。如果我们现在需求是希望不允许普通用户执行计划任务,则可以在/etc/at.deny文件中添加用户,例如我们不允许tom用户查询和创建计划任务,则可以参考图1-12。此时tom用户已经是不允许创建和查询计划任务了,而我们现在又希望tom用户能够创建个查询计划任务,我们可以使用两种方式来实现,第一种是把tom用户从/etc/at.deny文件中删除;第二种方式是我们创建一个/etc/at.allow文件,并将tom用户添加进去,由于系统默认当同一用户同时存在/etc/at.allow和/etc/at.deny文件的时候,是/etc/at.allow文件中的设置生效(图1-13)。
# vim /etc/at.deny
# vim /etc/at.allow
【讲清楚,说明白!】计划任务crontab及企业实战应用
【讲清楚,说明白!】计划任务crontab及企业实战应用


(二)crontab计划任务
(2.1)如果我们希望Linux系统能够周期性的、有规律的执行某些具体的任务,那么Linux系统中默认启用的crond服务简直再合适不过了。创建、编辑计划任务的命令为“crontab -e”,查看当前计划任务的命令为“crontab -l”,删除某条计划任务的命令为“crontab -r”。另外,如果您是以管理员的身份登录的系统,还可以在crontab命令中加上-u参数来编辑他人的计划任务。
(2.2)如果我们想查询当前用户在系统中存在的计划任务可以使用“crontab -l”,如果我们想查询tom用户在系统中存在的计划任务可以使用-u指明用户。
# crontab -l---查询当前用户在系统中存在的计划任务
# crontab -l -u tom---查询tom用户在系统中存在的计划任务
【讲清楚,说明白!】计划任务crontab及企业实战应用
(2.3)如果我们想要编辑当前用户的计划任务,则可以使用“crontab -e”,如果想要对指定的用户编辑计划任务,则应该再加上“-u”的选项(图2-3)。我们在正式部署计划任务之前,需要先默念一下口诀“分、时、日、月、星期、命令”,这是使用crond服务设置任务的参数格式,需要注意的是,如果有些字段没有设置,则需要使用星号(*)占位。例如我们现在的需求是计划在每天上午7点整执行一个脚本DeleteLock.sh,目标是查找到/mail分区下所有后缀为“.lock”的文件,并将这些文件清除(图2-4至图2-6)。
# crontab -e -u tom---指定对tom用户创建一个计划任务
find /mail -type f -name "*.lock" -exec rm -rf {} \;---查找到/mail分区下所有后缀为“.lock”的文件,并将这些文件清除
【讲清楚,说明白!】计划任务crontab及企业实战应用
【讲清楚,说明白!】计划任务crontab及企业实战应用
【讲清楚,说明白!】计划任务crontab及企业实战应用
【讲清楚,说明白!】计划任务crontab及企业实战应用
【讲清楚,说明白!】计划任务crontab及企业实战应用
(2.4)如果我们的需求是星期一到星期五上午的7点整准时执行DeleteLock.sh脚本文件,则可以使用如下的三种方式来进行表示。
【讲清楚,说明白!】计划任务crontab及企业实战应用
(2.5)如果我们现在的需求是在每天上午7点0分、5分、10分、30分执行一次DeleteLock.sh脚本文件,则可以使用如下的表示方式。
【讲清楚,说明白!】计划任务crontab及企业实战应用
(2.6)现在我们的需求是1到3月份周一至周五每天上午7点整执行DeleteLock.sh脚本文件,即表示1到3月份所有的工作日都执行该命令(图2-9)。或者我们的需求是1到3月份每个月的1到10号上午7点整我们都执行DeleteLock.sh脚本文件(图2-10)。而当我们将以上两种情况进行合并时,代表的并不是交集,而是并集,即表示1到3月份中每个月1至10号或者是所有的工作日都会执行DeleteLock.sh脚本文件(图2-11)。
【讲清楚,说明白!】计划任务crontab及企业实战应用
【讲清楚,说明白!】计划任务crontab及企业实战应用
【讲清楚,说明白!】计划任务crontab及企业实战应用
(2.7)如果我们想要查看所创建计划任务则可以使用“crontab -l”命令进行查询。
# crontab -l---查询所有创建的计划任务
【讲清楚,说明白!】计划任务crontab及企业实战应用
(2.8)我们使用crontab创建的计划任务都是保存在/var/spool/cron/目录下的,我们进入到root文件中可以查看详细的信息。
# cd /var/spool/cron/
【讲清楚,说明白!】计划任务crontab及企业实战应用
【讲清楚,说明白!】计划任务crontab及企业实战应用
(2.9)如果我们有一个很复杂的业务需求,在设计计划任务的时候也没有必要考虑的很复杂,我们可以把这个复杂的需求,拆分成多个简单的条目来执行就可以了。比如我们现在的需求是每月的最后一天凌晨2点来执行DeleteLock.sh脚本文件。我们可以在crontab中创建四个条目,第一条设置1、3、5、7、8、10、12月每月31号执行DeleteLock.sh脚本;第二条设置4、6、9、11月每月30号执行DeleteLock.sh脚本;第三条创建一个脚本在每年的2月29日凌晨2点执行DeleteLock.sh脚本;第四条创建一个判断脚本cc.sh,在每年的2月1日判断当年是否是闰年,如果是闰年则使用swd或者awk命令将日期部分设置成29号,如果不是闰年则在cc.sh脚本中使用swd或者awk命令将29号替换成28号。
【讲清楚,说明白!】计划任务crontab及企业实战应用
(2.10)在我们系统中也是存在着很多的系统任务的,我们进入到/etc/目录下可以看到cron*开头的所有文件,其中“/etc/cron.daily”代表的是每日执行的计划任务,“/etc/cron.hourly”代表的是每小时执行的计划任务,“/etc/cron.monthly”代表的是每月执行的计划任务,“/etc/cron.weekly”代表的是每周执行的计划任务。如果我们想要在特定的时间执行特定的计划任务,则可以将编写好的脚本放到对应的目录当中。
【讲清楚,说明白!】计划任务crontab及企业实战应用
(2.11)如果我们需要将创建的计划任务删除,则可以使用“crontab -r”将root用户创建的所有计划任务全部删除。
# crontab -r
【讲清楚,说明白!】计划任务crontab及企业实战应用
(2.12)在系统中默认是允许普通用户创建计划任务的,如果我们想要限制普通用户创建计划任务,则可以通过创建/etc/cron.deny文件,并填写需要禁止的用户名即可(图2-18)。如果此时我们又允许tom用户可以创建计划任务,那么我们可以通过两种方式来实现,第一种是在/etc/cron.deny文件中将tom用户删除即可;第二种是我们再次创建一个/etc/cron.allow文件,并将tom用户填写到文件中,此时我们发现虽然/etc/cron.allow配置文件和/etc/cron.deny配置文件中都填写了tom用户,但是用户同时存在时默认是以/etc/cron.allow配置文件中的信息生效(图2-19)。
# vim /etc/cron.deny
【讲清楚,说明白!】计划任务crontab及企业实战应用
【讲清楚,说明白!】计划任务crontab及企业实战应用


(三)清理临时文件
(3.1)在系统中很多时候会生成一些系统的临时文件,例如在/tmp目录下存在很多系统自动生成的文件。
# ls /tmp/
【讲清楚,说明白!】计划任务crontab及企业实战应用
(3.2)例如我们现在的需求是将3天之前生成的系统文件全部清理掉,此时我们先将tmpwatch命令对应的软件安装起来,我们使用man tmpwatch命令可以查看tmpwatch命令相关参数的使用方法(图3-3),我们将当前目录中3天以前访问的文件全部删除掉(图3-4),我们希望将当前目录中3小时以上时间没有访问的文件全部删除,则需要加上“-f”强制删除的选项(图3-5)。
# yum install tmpwatch -y
# tmpwatch -u 3d .---将当前目录中3天以前访问的文件全部删除掉
# tmpwatch -u 3h . -f---将当前目录中3小时以上时间没有访问的文件全部删除
【讲清楚,说明白!】计划任务crontab及企业实战应用
【讲清楚,说明白!】计划任务crontab及企业实战应用
【讲清楚,说明白!】计划任务crontab及企业实战应用
【讲清楚,说明白!】计划任务crontab及企业实战应用
(3.3)当然我们的系统中还是有其他清除临时文件的工具的,在RHEL7中新增加了一个服务用来管理临时文件的。
# systemctl list-unit-files | grep systemd-tmpfi
【讲清楚,说明白!】计划任务crontab及企业实战应用
(3.4)systemd-tmpfiles-setup.service这个服务可以定期清理一些文件,还可以定期创建一些必须的文件或目录,systemd-tmpfiles要读取自己的配置文件才能知道要清理哪些临时文件,它需要读取的配置文件主要是放在如下的目录中的。
# ls /usr/lib/tmpfiles.d/---保存都是系统自动生成的文件供systemd-tmpfiles进行读取,一般是不建议大家对其中的内容进行修改
# ls /run/tmpfiles.d/---保存都是系统守护进程产生的文件供systemd-tmpfiles进行读取,我们一般也是不用去修改的
# ls /etc/tmpfiles.d/---主要存放的是用户自己管理的一些配置文件供systemd-tmpfiles进行读取,一般我们自定义的配置文件都是建议放在这个目录中的
【讲清楚,说明白!】计划任务crontab及企业实战应用
(3.5)我们在/etc/tmpfiles.d/目录下创建一个aa.conf的配置文件,指定创建的目录、目录的默认权限、目录的属主属组信息、超时清理文件的时间等。
# cd /etc/tmpfiles.d/
【讲清楚,说明白!】计划任务crontab及企业实战应用
【讲清楚,说明白!】计划任务crontab及企业实战应用
(3.6)接着我们执行systemd-tmpfiles命令时,系统便会自动创建/tmp/aa目录(图3-10)。接着我们进入/tmp/aa目录中创建一个test.txt文件,然后等10秒后执行“clean”命令,此时我们发现/tmp/aa/目录中的所有文件都已经清理了(图3-11)。
# systemd-tmpfiles --clean
【讲清楚,说明白!】计划任务crontab及企业实战应用
【讲清楚,说明白!】计划任务crontab及企业实战应用
(3.7)如果我们在/tmp/aa目录下再创建一个目录rh124并在目录中创建一个文件,然后等待10秒后重新修改目录最后的访问时间,接着再次去执行systemd-tmpfiles的清理临时文件的操作。此时由于rh124目录没有超过10秒,目录中的文件testRH124.txt文件超过了10秒,执行清理文件的命令后,我们发现rh124仍然是存在的,但是目录下的文件testRH124.txt已经清理了。
【讲清楚,说明白!】计划任务crontab及企业实战应用
(3.8)由于在执行“systemd-tmpfiles”相关的命令时会读取三个目录包括:/usr/lib/tmpfiles.d/目录、/run/tmpfiles.d/目录、/etc/tmpfiles.d/目录下的所有的配置文件的信息。而如果我们只想读取某一个特定的配置文件进行执行,则可以在最后指定特定的配置文件名,例如指明aa.conf,那么就不会清理其他配置文件中的条目。
# systemd-tmpfiles --clean aa.conf---我们可以加上aa.conf,指明只是执行清理aa.conf配置文件中条目
【讲清楚,说明白!】计划任务crontab及企业实战应用
(3.9)当然我们在/etc/tmpfiles.d/目录下创建好aa.conf配置文件后,系统也是会定期对我们所创建的配置文件中的条目进行清理的。在/usr/lib/systemd/system这个目录中存放了定期执行配置文件的文件(图3-14),例如“OnBootSec=15min”表示开机后15分钟会执行systemd-tmpfiles-clean的操作(图3-15)。当然/usr/lib/systemd/system目录中包含定期执行的文件的执行范围默认是对应/usr/lib/tmpfiles.d/目录、/run/tmpfiles.d/目录、/etc/tmpfiles.d/目录下的所有的配置文件中的条目的。
# cd /usr/lib/systemd/system
# vim systemd-tmpfiles-clean.timer
【讲清楚,说明白!】计划任务crontab及企业实战应用
【讲清楚,说明白!】计划任务crontab及企业实战应用

—————— 本文至此结束,感谢阅读 ——————

上一篇:条件竞争(race condition)


下一篇:UVA11762 Race to 1