Linux系统提供了at和crontab命令来执行定时任务,at主要针对一次性定时任务,而crontab执行周期性定时任务。Cronjob在linux运维中应用广泛。安装linux系统时,linux会自动启动crond进程,这是周期性任务的守护进程,用于检查是否有需要执行的调度任务。
crontab命令的通用参数:
crontab file [-u user]
-用指定的文件替代目前的crontab.
crontab -[-u user]
-用标准输入替代目前的crontab.
crontab -l [user]
-显示当前存在的crontab任务 .
crontab -e [user]
-用于编辑创建crontab文件任务 .
crontab -r [user]
-删除当前用户crontab文件(文件保存路径为/var/spool/cron/username) .
crontab -c dir
-指定crontab的目录。
创建新的crontab文件
在考虑向cron进程提交crontab文件之前,首先要做的是设置环境变量编辑器。根据它,cron进程决定使用哪个编辑器来编辑crontab文件。大多数用户使用vi。如果你像边肖一样使用vi,直接编辑。配置文件,并添加:
EDITOR=vi; export EDITOR ~ source .bash_profile
crontab命令时间格式设置
crontab任务字段有六个,前五个是时间字段:时间、日、月、周;第六个是执行命令字段,可以是单个命令或脚本文件。时间字段可以使用特殊字符’*’代表所有可能的值,’,’代表所选的时间段,’-‘代表选定的时间范围,’/’表示时间间隔频率。
例如:
? ~ crontab -l */1 10-14 24,25 * * echo `date` >> /root/date.log
含义:在每月24日和25日的10: 00到14: 00,每隔一分钟向/root/date.log文件输出一个日期。
? ~ crontab -l30 21 * * * /usr/local/etc/rc.d/lighttpd restart
含义:每晚21:30重启apache。
我们已经知道了cronjob的基本设置和使用方法,但是我们在创建cronjob任务的时候,经常发现crontab调度的任务不执行,真的很郁闷!不要紧,往下看~
Crontab计划任务不执行故障排除想法
两个重要的目录文件
关于crontab任务,我们需要知道几个目录文件。这些文件对于我们分析crontab调度任务不执行的原因非常有用。
/var/log/cron,用于记录crontab任务执行日志的文件,不论执行成功与否都会被记录。/var/spool/***il/username,用于记录crontab任务执行失败日志的文件,linux系统中每个定时任务执行后,系统都会将 失败的任务信息通过电子邮件的形式发送给当前系统用户。
执行故障排除过程(例如)
我创建了一个调度任务,每分钟关闭一次iptables任务,但是iptables没有关闭。
查看日志tail /var/spool/***il/root,发现这个服务命令目录并不存在:
~哪个服务/usr/***in/service ~ crontab-e */1 * * */usr/***in/serviceiptables stop可以解决这个问题。这个例子反映了一个普遍现象。当我们在当前shell中执行脚本时,没有问题,但是一旦写入cronjob,就会出现各种问题。这是因为cronjob不会自动加载我们脚本需要的各种环境变量,我们需要手动将它们添加到cronjob任务中,以保证cronjob正常运行。
变通方法修改:
? ~ crontab -l SHELL=/bin/sh PATH=PATH=/***in:/bin:/usr/***in:/usr/bin */1 * * * * service iptables stop
这种方法可以用来解决python脚本或者mongodb脚本无法定时执行的问题。
阻止cronjob执行的其他容易被忽略的原因:
定时任务路径问题,在cronjob中最好使用绝对路径来定位脚本或者输出文件。脚本权限问题,修改脚本权限,通常来说chmod 777即可。系统时间问题,校准系统时间。crond服务问题,确保服务状态正常,service crond status。
本文来自夜遇投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/573799.html