工作中使用频率较高的一个自动化服务------crontab计划任务

本文深入解析Crontab命令,介绍其在Unix和类Unix系统中的应用,包括任务计划、周期性执行、用户权限管理和服务重启等内容。通过实例演示如何设定单一任务和周期性任务,涵盖at命令和crontab编辑技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.crontab概念了解:
crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρνο),原意是时间。通常,crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。
我们可以将其简单的理解为一个定时器类似与闹铃的功能,当我们将任务罗列出来之后在规定的时间执行我们相应的操作。
例如:我们可以通过crontab实现以下操作:

1)每分钟需要执行一个程序去检查系统运行状态;
2)每天凌晨需要对过去的一天业务数据进行统计;
3)每个星期需要把日志文件备份(如果日志信息太多那么占用的磁盘空间就会越大,而且日志我们大多都是实时分析一周之内的日志信息,而超出一周的日志我们会将它进行备份)每天凌晨两三点钟进行备份;
4)每个月需要把数据库进行备份;

2.了解针对单个用户、系统用户设定的计划任务:

单个用户的计划任务:单一一次的计划任务或周期性的计划任务。单一一次的计划任可以通过命令at实现;
系统级别的计划任务:大多是周期性的计划任务。周期性的计划任务,可以通过创建cron表实现,通过命令crontab -e来创建。

3.通过at命令实现单一任务计划的制定:
#我们可以通过man at来查看at命令的相关用法

at:定义计划任务;
atq:查看计划任务;
atrm:删除计划任务;

#使用方法,举个简单的例子,当前时间的两分钟之后通过wall命令广播一条语句:

[root@server ~]# at now + 2minutes
at> wall hello,laowang      //输入要执行的命令,Ctrl+D保存退出
#通过atq命令查看计划任务(注意:当我们制定的计划任务执行之后再次查看就没有显示了)
[root@server ~]# atq
2	Sat Mar  9 22:12:00 2019 a root
#/var/spool/at目录下是当计划任务没有执行时会产生一个普通文件,但是执行后该位置的文件也就不在了
#删除计划任务,利用好编号进行删除
[root@server ~]# atq
3	Sat Mar  9 22:15:00 2019 a root
[root@server ~]# atrm 3
#单一任务计划at指定某一个准确的时间点执行
[root@server ~]# at 22:18 March 09
at> wall hello wangcai<EOT>
job 5 at Sat Mar  9 22:18:00 2019
[root@server ~]# 
Broadcast message from root@server (Sat Mar  9 22:18:00 2019):
hello wangcai
注意:我们制定的单一任务计划wall广播一条信息,当计划执行完毕是不会自动退出的,利用Ctrl+C进行退出。

4.通过crontab实现周期性的任务计划(周期性永久生效,通过编辑cron表实现,通过命令crontab来进行管理):
4.1crontab命令格式简介:

crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]
-u user:编辑某个用户的cron表,只有root用户可以使用此参数为别的用户设置cron服务。也可用于给用户指定crontab文件;
-l:列出当前用户的crontab;
-r:删除当前用户的crontab;
-e:添加cron表,默认是类似与vim的editor编辑器,当计划任务表格式写的有问题时是不能正常退出的;
-i:与-r一起使用,用来询问用户是否直接删除crontab;

4.2了解cron表的格式:

[root@server ~]# vim /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=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指定了我当前使用的SHELL是什么;
PATH指定了我命令的执行路径是什么;
MAILTO指定当任务计划发生错误应发邮件给谁;
5个*分别代表:分、时、日、月、周;    
Minute:表示分钟,可以是从0到59之间的任何整数;
Hour:表示小时,可以是从0到23之间的任何整数;
Day:表示日期,可以是从1到31之间的任何整数;
Month:表示月份,可以是从1到12之间的任何整数;
Week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日;
Command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件;
在以上各个字段中,还可以使用以下特殊字符:
星号(*):代表所有可能的值,例如:month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作;
逗号(,):可以用逗号隔开的值指定一个列表范围,例如:“1,2,5,7,8,9”;
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”;
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

下面我们以几个简单的案例来练习以下crontab的使用:
案例一:每周的星期一到星期五的9点钟广播一条上课了的计划任务

[root@server ~]# crontab -e
0 09 * * 1-5 wall shangkele
#可以通过crontab –l命令来查看我当前用户的计划任务
[root@server ~]# crontab -l
0 09 * * 1-5 wall shangkele
#周期性配置文件默认的路径(周期性执行的原因是写好这个计划任务后会在该目录下
有一个和该用户名相同的文件执行后不会移出永久存在)
[root@server ~]# cd /var/spool/cron/
[root@server cron]# ll
-rw-------. 1 root root 28 3月   9 22:40 root
#删除任务计划
[root@server cron]# crontab –r        //清除我的所有计划任务列表,一般不建议使用,我们可以在配置文件中进行删除

案例二:指定某些用户可以执行计划任务。对于普通用户设置计划任务,但我们也可以设置哪些普通用户可以设置计划任务哪些用户不可以设置

#拒绝某些用户利用at命令设定任务计划(编辑配置文件,将不可以执行的计划任务的用户写上就好)
[root@server cron]# vim /etc/at.deny redhat
#切换到redhat用户下进行测试
[root@server cron]# su - redhat
[redhat@server ~]$ at now +1minutes
You do not have permission to use at.
注意:在系统中并没有at.allow这个文件,但是只要你编辑这个文件,再次允许你这个用户
可以编写计划任务也是可以的(系统默认先看允许再看拒绝的)。
[root@localhost ~]# vim /etc/at.allow
Redhat
#同理如果要用周期性的任务计划拒绝或允许某些用户我们可以编辑以下两个配置文件:
[root@server cron]# vim /etc/cron.deny
[root@server cron]# vim /etc/cron.allow

案例三:针对系统用户制定周期性任务计划,在每天的8点零6分执行某个脚本信息

#因为默认我们的crontab服务是关闭的,所以我们应该首先启动服务
[root@server ~]# systemctl restart crond.service 
#编辑全局配置文件使得对当前系统上的所有用户生效
[root@server ~]# vim /etc/crontab 
注意:run-parts是一个脚本,默认目录是/usr/bin/run-parts,作用就是执行一个目录下的所有脚本/程序;当我们需要在同一时间执行多个脚本的时候避免多次写可以用 run-parts来执行。
06 08 *  *  * run-parts /etc/cron.daily

#了解crontab –e与/etc/crontab 的区别

crontab -e是当前用户自定义的,只针对当前用户生效,而/etc/crontab是针对系统上的所有用户生效的。

案例四:扩展计划任务
假设当你的计划任务应该在某个时间点执行,但由于一些因素(断电或设备宕机)而没有执行的话,那么这个计划任务还执不执行,应该什么时候执行?所以我们可以通过扩展任务计划来实现在设备开机后会开机检查计划任务中哪些执行了哪些没有执行,然后在指定时间内去执行那些没有执行的计划任务。

[root@server ~]# vim /etc/anacrontab 
#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
period in days:天数时期;
delay in minutes:延长多长时间执行;
job-identifier:任务标识符;
command:执行的相应命令;
例如:配置文件中的第一条为每一天开机以后5分钟去检查cron.daily这个脚本是否执行,如果没有执行就进行执行操作。          

对于crontab的练习和掌握我认为我们还得多多练习,因为在现实的生产环境之中对于crontab的应用还是比较多的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值