详解Linux下crontab的使用与注意事项
crontab是一个用于设置周期性被执行的指令。其守护进程为crond.crontab分为两种配置模式,一种为用户级的crontab,一种为系统级的crontab,这里我们分开来谈。
用户级crontab
用户使用新建循环型工作调度时,使用的crontab命令,crontab-e所有用户都可以使用,普通用户也只能为自己设置计划任务。然后自动写入/var/spool/cron/usename
用户控制文件
/etc/cron.allow:
将可以使用crontab的用户写入,仅该文件内的用户可以使用crontab,相当于白名单
/etc/cron.deny:
将禁止使用crontab的用户写入,仅该文件内的用户禁止使用crontab,相当于黑名单
其中/etc/cron.allow优先级大于/etc/cron.deny,为避免混淆,建议二者仅使用一个。
命令
crontab[-uusename][-l|-e|-r] 参数: -u:只有root才能进行这个任务,也即帮其他用户新建/删除crontab工作调度 -e:调用vi编辑crontab的工作内容 -l:列出crontab的工作内容 -r:删除所有crontab的工作内容。
语法
#.----------------分钟(0-59) #|.-------------小时(0-23) #||.----------日期(1-31) #|||.-------月份(1-12)ORjan,feb,mar,apr... #||||.----周几(0-6)(Sunday=0or7)ORsun,mon,tue,wed,thu,fri,sat #||||| #*****命令
语法与系统级crontab很相似,不同点在于此处不需要指定执行用户,而系统级crontab(/etc/crontab)中需要。
举例如下:
*/10****/home/test.sh#每隔10分钟就以当前用户执行一次/home/test.sh脚本 02***/home/test.sh#每天2点 05,17***/home/test.sh#每天5点、17点 017**sun/home/test.sh#每周日17点 04,17**sun,mon/home/test.sh#每周一、周日 @reboot/home/test.sh#系统重启时
这里推荐一个在线小工具:在线生成cron表达式
系统级crontab
系统级crontab一般用于系统的例行性任务,这种方法更加方便与直接直接给其他用户设置计划任务,而且还可以指定执行shell等。配置文件为/etc/crontab,该文件仅root用户能够编辑。
编辑/etc/crontab
默认内容如下:
SHELL=/bin/bash这里是指定使用哪种shell接口 PATH=/sbin:/bin:/usr/sbin:/usr/bin这里指定文件查找路径 MAILTO=root如果有额外的STDOUT,以email将数据送给谁,可以指定系统用户,也可以指定email地址,如alliot@iots.vip #Fordetailsseeman4crontabs #Exampleofjobdefinition: #.----------------分钟(0-59) #|.-------------小时(0-23) #||.----------日期(1-31) #|||.-------月份(1-12)ORjan,feb,mar,apr... #||||.----周几(0-6)(Sunday=0or7)ORsun,mon,tue,wed,thu,fri,sat #||||| #*****用户名命令
即:
分时日月周执行用户任务命令
比如我要添加一个计划任务,每隔10分钟就以root身份执行一次/home/test.sh脚本,则在后面添加:
*/10****root/home/test.sh
这里注意,不要漏掉执行者root(用户级的crontab中不需要指定执行者),否则会在/var/log/cron日志中出现”ERROR(getpwnam()failed)”错误,计划任务无法正常运行。
重启服务
一般来说Linux下的crontab会自动帮我们每分钟重新读取一次/etc/crontab的例行工作事项,但是出于某些原因或者是其他的Unix系统中,由于crontab是读到内存当中的,所以栽修改完/etc/crontab之后,可能并不会马上执行,这时候需要重启crontab服务。
这里以CentOS为例:
servicecrondstart//启动服务 servicecrondstop//关闭服务 servicecrondrestart//重启服务 servicecrondreload//重载配置 servicecrondstatus//服务状态
如果是CentOS7则:
systemctlrestartcrond.service//重启服务 systemctlstartcrond.service//启动服务 systemctlstopcrond.service//停止服务 systemctlreloadcrond.service//重载配置 systemctlstatuscrond.service//服务状态
其他注意事项
取消不需要的输出
当执行结果或者执行的选项中有输出的数据时,该数据会通过mail发送给MAILTO指定的账号,若某一个调度一直出错,同时mail服务出现问题(事实上我根本就没开这个服务),将会产生大量的文件于/var/spool/clientmqueue/,所以最好是将crontab里面的命令后面加上>/dev/null2>&1
2>:重定向错误。
2>&1:把错误重定向到输出要送到的地方。即把上述命令的执行结果重定向到/dev/null,即抛弃,同时,把产生的错误也抛弃。
检查日志
日志保存在/var/log/cron中
语法区别
- crontab-e命令会检查语法,而vim编辑/etc/crontab则不会,这里注意的是,crontab-e不需要写执行者用户名,而/etc/crontab需要指定。
- 执行路径必须使用绝对路径,否则可能无法正常执行。
- 周与日、月不能共存,即你可以分别以周或者是日、月为单位进行循环,但不可指定“几月几号且为星期几”的模式工作。
参考资料
鸟哥的Linux私房菜
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。