计划任务at和cron

某时间点只执行一次计划任务:

at:在未来某时间点执行一次任务

查看at的rpm包是否安装:centos6和centos7都是at包。
在这里插入图片描述

at命令的进程将作为守护进程运行,即成为服务一直运行;

  • 在centos6中:

#rpm -ql at ,at进程以atd服务运行:服务路径如下
在这里插入图片描述
同时在运行3级别中,atd服务是开机自启的。
在这里插入图片描述

  • 在centos7中:

#rpm -ql at,at进程以atd服务运行:服务路径如下
在这里插入图片描述
at服务在centos7中也是开机自启的。
在这里插入图片描述

  • 同时:systemctl 命令可以同时管理多个服务,而service不行。

at命令的相关知识:

at任务执行方式:交互式;输入重定向;at -f 文件;三种。
at命令依赖于atd服务,需要启动才能实现at任务。
at队列存放在/var/spool/st目录中,当删除某个at任务时,该目录中相应的任务文件也会被系统删除。
/etc/at.{alow,deny}控制普通用户是否能执行at任务。优先级为:

  • 1.如果两个文件都不在,则只有root可以执行at命令。
  • 2.白名单:/etc/at.allow文件默认不存在,当存在时,只有该文件中的普通用户可以执行at命令(即一旦有了白名单,黑名单将不生效,优先级)。
  • 3.黑名单:/etc/at.deny文件默认存在,该文件中的普通用户不可以执行at命令,不在文件中的普通用户则可以执行at命令。

at命令讲解:

at命令格式:#at [option] TIME
常用[option]
-V:显示版本信息;
-l:列出指定队列中等待运行的作业;相当于atq
-d:删除指定的作业;相当于atrm
-c:查看具体作业任务;
-f:/path/…/filename:从指定文件中读取任务;
-m:当任务被完成后,将给用户发送邮件,即使没有标准输出;
注意
作业执行命令的结果中的标准输出和错误输出都将以邮件通知给相关用户;
系统开机情况下,当定义时间超过目前的时间,则默认是明天的定义时间;
当定义时间到达时,系统处于关机状态,则该计划任务会保留(给管理员看),但不会再执行(过期不候)
TIME:定义出什么时候进行at这项任务的时间;
HH:MM[yyyy-mm-dd]
tomorrow
now+时间{minutes,hours,days,weeks}
at命令例子:at命令在没有文件导入时,是需要进入交互模式编写的。
在交互式中:保存退出(Ctrl+D),不保存退出(Ctrl+C);
1.在13:00,执行删除/data/app/目录下的文件和目录
#at 13:00
在这里插入图片描述
2.在2020-8-9日13:00点执行命令#echo date
#at 13:00 2020-08-09
在这里插入图片描述
3.在明天凌晨5点执行命令# echo "today is date"
#at 5:00 tomorrow
在这里插入图片描述
4.5分钟以后执行命令#echo "yesterday is date +%F -d "-1 day" "
#at now+5min/minutes
在这里插入图片描述
5.两周后的此时,执行命令#ls /root
#at now+1weeks
在这里插入图片描述
6.18:00执行at.sh文件中的命令;
#at 18:00 -f /root/at.sh 或#at 18:00 < /root/at.sh
在这里插入图片描述
7.三天后的下午3点执行命令#echo date
#at 3:00pm+3days
在这里插入图片描述
8.查看上述任务,并删除任务编号为15的任务,同时查看编号为14的任务内容;
#at -l
#at -d 15
#at -c 14
在这里插入图片描述

batch:系统自行选择空闲时间去执行此处指定的任务。

系统自行选择空闲时间,至于是哪个时间,人是不知道的(不推荐使用,这里不做叙述)。

周期性的执行计划任务:cron

cron相关程序包:

cronie:主程序包,提供crond守护进程及相关辅助工具。
cronie-anacron:cronie的补充程序,用于监控cronie任务执行状况,如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务。
crontabs:包含Centos提供系统维护任务。
#rpm -ql cronie(进程为crond)
在这里插入图片描述
计划周期性执行的任务提交给crond,到指定时间会自动运行。

cron任务分类及日志文件:

系统cron任务:系统维护作业

  • /etc/crontab:系统级任务调度主要完成系统的一些维护操作,比如写缓存数据到硬盘、日志清理等。

用户cron任务:用户定期要执行的工作

  • #crontab命令:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。每个用户都有专用的cron任务文件,即文件/var/spool/cron/用户名(该文件中包含有该用户的所有计划任务)。

日志:/var/log/cron
/var/log/cron只会记录是否执行了某些计划的脚本,但是具体执行是否正确以及脚本执行过程中的一些信息则linux会每次都发邮件到该用户下。
#less /var/spool/mail/root(root用户的邮件路径)
#mail (查看邮件)

注意:运行结果的标准输出和错误输出都会以邮件通知给相关用户。
(1):COMMAND > /dev/null
(2):COMMAND & /dev/null
对于cron任务来讲,%有特殊的用途,如果在命令中要使用%,需要转义符""转义。或将%放置于单引``号中,则可不用转义;

用户crontab命令及系统文件/etc/crontab讲解:

ctontab命令:
格式:#crontab [-u user] [-l | -r | -e] [-i]
-l:列出所有任务;
-e:编辑任务;
-r:删除计划任务,不加-u指定用户,则默认删除当前用户的计划任务;
-i:与-r一起使用,删除用户计划任务前再询问一次;
-u user:仅root可运行,指定用户管理cron任务。
#crontab -r -u 用户 删除某用户的定时任务:
==> 从/var/spool/cron目录中删除用户的crontab文件
==> 如果不指定用户,则默认删除当前用户的crontab文件
控制用户执行计划任务:/etc/cron.{allow,deny}。

关于计划任务命令格式:查看文件/etc/crontab
在这里插入图片描述
前四行是用来配置crond任务运行的环境变量
第一行SHELL变量:指定了系统要使用哪个shell,这里是bash
第二行PATH变量:指定了系统执行命令的路径
第三行MAILTO变量:指定了crond的任务执行信息将通过电子邮件发送给root用,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户。
第四行的HOME变量:指定了在执行命令或者脚本时使用的主目录。
关于crontab命令的细节:
格式:
分(0-59) 时(0-23) 日(1-31) 月(1-12) 星期(0-6) 用户名 命令
其中:
命令COMMAND:

  • 在centos6和centos7中,都可以直接写命令,不用写绝对路径(若$PATH中不包含该命令,则需要写绝对路径)。
  • 当有多个命令时,使用";"。后面的文件路径需要是绝对路径。
  • 执行脚本文件时,可以“脚本|或bash 脚本|或/bin/bash 脚本”

星号(*):代表所有可能的值,如month字段为星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”。
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”。
正斜线(/):可以用正斜线指定时间的间隔频率,以小时为例:0-23/2表示每两小时执行一次。 */2表示每隔两小时;(注意:每当进入一个新的小时,分钟会从新计算。所以,*/n * * * * 当 n 能被 60 整除的时候,就是:每 n 分钟执行一次 )。
注意/小结:

  • 命令的执行最好用脚本。
  • 周和日最好不要同时用;
  • 定时任务要加注解;
  • 定时任务一定是绝对路径,且目录必须存在才能出结果;
  • crontab 服务一定要开启运行;
  • 新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。
  • 当crontab失效时,可以尝试/etc/init.d/crond
    restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。
  • 千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。
  • 在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义%,如经常用的date "+%Y%m%d"在crontab里是不会执行的,应该换成date ‘+%Y%m%d’。更新系统时间时区后需要重启cron。
  • 每条命令执行完毕之后,系统会自动将输出发送邮件给当前系统用户。日积月累,非常的多,甚至会撑爆整个系统。所以每条命令后面进行重定向处理是非常必要的: >>/dev/null 2>&1。
  • 每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件可以查看但是不可以直接编辑的,只可以用crontab -e 来编辑。
  • cron启动后每过一份钟都会读取/var/spool/cron/username和/etc/crontab这两个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。
  • 在默认情况下,如果cron每执行一次指令后,都会向用户的本地信箱中发送邮件,时间长了则产生数量很多的邮件。那么如何禁止掉呢?可能通过下面的方法来实现:
    ■.将执行命令的信息重定向到 cron_command >/dev/null 2>&1 。
    ■.将执行命令的信息重定向到cron_command &>/dev/null。
    ■.在crontab设置文件中指定发送到得邮件 MAILTO=""。

cron计划任务实例:

[root@localhost test]#crontab  -l
50 15 * * * tar -cf /root/test/testdir.tar /root/test/testdir
51 17 * * * tar -czf /root/test/testdir`date +\%F`.tar.gz /root/test/testdir &>/dev/null
55 17 * * * tar -czf /root/test/testdir2`date +\%Y-\%m-\%d-\%H:\%M:\%S`.tar.gz /root/test/testdir &>/dev/null

##在每周的周日到周4,下午5点6-12分钟之间,每隔2分钟执行一次该命令。
06-12/2 17 * * 0-4 echo "words" >>/root/test/words.txt 
##在每天凌晨1点期间,每隔一分钟执行一次该命令。
* 1 * * 0-4 echo "times" >>/root/test/times.txt 
##在centos6系统中,4月份的每周周1和周3的11点重启httpd服务。
0 11 * 4 1,3  service httpd restart

50 15 * * * bash /root/test/example.sh
10 16 * * * /bin/bash /root/test/log.sh
50 15 * * * /root/test/no.sh


cron的环境变量问题:

有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。
在crontab文件中定义多个调度任务时,需要特别注环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这样,系统执行任务调度时就没有问题了。
不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:
脚本中涉及文件路径时写全局路径;
脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
在这里插入图片描述
3.当手动执行脚本OK,但是crontab死活不执行时,很可能是环境变量惹的祸,可尝试在crontab中直接引入环境变量解决问题。如:
在这里插入图片描述

创建一个新的cronta文件:

向cron进程提交一个crontab文件之前,首先要设置环境变量EDITOR。cron进程根据它来确定使用哪个编辑器编辑crontab文件。9 9 %的UNIX和LINUX用户都使用vi,如果你也是这样,那么你就编辑$HOME目录下的. profile文件,在其中加入这样一行:
在这里插入图片描述
然后保存并退出。不妨创建一个名为 cron的文件,其中是用户名,例如, davecron。在该文件中加入如下的内容。
在这里插入图片描述
在上面的例子中,系统将每隔1 5分钟向控制台输出一次当前时间。如果系统崩溃或挂起,从最后所显示的时间就可以一眼看出系统是什么时间停止工作的。在有些系统中,用tty1来表示控制台,可以根据实际情况对上面的例子进行相应的修改。为了提交你刚刚创建的crontab文件,可以把这个新创建的文件作为cron命令的参数:
在这里插入图片描述
现在该文件已经提交给cron进程,它将每隔1 5分钟运行一次。同时,新创建文件的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名(即dave)。

cron可能出现的问题和处理:

1.备份当前用户的crontab任务:
#crontab -l > H O M E / m y c r o n ∗ ∗ 2. 恢 复 误 删 除 的 c r o n t a b 文 件 ( 前 提 : 有 备 份 ) ∗ ∗ 如 果 不 小 心 误 删 了 c r o n t a b 文 件 , 假 设 你 在 自 己 的 HOME/mycron **2.恢复误删除的crontab文件(前提:有备份)** 如果不小心误删了crontab文件,假设你在自己的 HOME/mycron2.crontabcrontabHOME目录下还有一个备份,那么可以将其拷贝到/var/spool/cron/,其中是用户名。如果由于权限问题无法完成拷贝,可以用:crontab 其中,是你在$ H O M E目录中副本的文件名。
有些crontab的变体有些怪异,所以在使用crontab命令时要格外小心。如果遗漏了任何选项,crontab可能会打开一个空文件,或者看起来像是个空文件。这时敲delete键退出,不要按,否则你将丢失crontab文件。
3.注意清理系统用户的邮件日志:
每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。 例如,可以在crontab文件中设置如下形式,忽略日志输出:
在这里插入图片描述
4.如何查看crontab任务是否正常执行
1、针对Linux系统的查询方法(含Redhat、SUSE)
看 /var/log/cron这个文件就可以,可以用tail -f /var/log/cron观察
2、针对UINX系统查询方法(AIX、HP-UX)
在 /var/spool/cron/tmp文件中,有croutXXX00999的tmp文件,tail 这些文件就可以看到正在执行的任务了。
3. mail任务(Linux UNIX)在 /var/spool/mail/root 文件中,有crontab执行日志的记录,用tail -f /var/spool/mail/root 即可查看最近的crontab执行情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值