Crond定时任务 任务调度
Crond是linux系统中用来定期执行命令或程序任务的服务.一般情况下,安装完操作系统之后,默认便会启动此任务调度服务.crond服务会定期检查系统中是否有要执行的任务工作,如果有,便会根据预先默认的规则自动执行该任务工作.
Linux任务调度的工作可以分为以下两类:
◆系统自身执行的工作:系统周期性执行的任务工作,如轮询系统日志,备份系统数据,清理缓存等.
◆用户执行的工作:某个用户定期要做的任务工作,例如每隔10分钟和互联网上服务器进行时间同步,每天晚上0点备份站点数据,一般此类这些工作需要由每隔用户自行设置.
1.1指令语法
Crontab [-u user]file
Crontab [-u user]{-l|-r|-e}
1.2指令说明
通过crontab我们可以在固定的间隔时间执行指定的系统指令或shell script脚本.时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合.这个命令非常适合周期性的日志分析或数据备份等工作.
1.3使用者权限文件
文件 | 说明 |
/etc/cron.deny | 该文件中所列用户不允许使用crontab命令 |
/etc/cron.allow | 该文件中所列用户允许使用crontab命令 |
/var/spool/cron/ | 所有用户crontab文件存放的目录,以用户名命名※ |
1.4指令选项说明含义表
参数名称 | 含义 | 指定示例 |
-l(字母) | 显示用户crontab文件内容.提示:l为list缩写 | Crontab –l※ |
-e | 进入vi编辑用户crontab文件,e为edit缩写 | Crontab –e※ |
-i | 删除用户crontab文件前确认提示 | Crontab –ri |
-r | 从crontab目录中删除用户crontab文件 | Crontab –r |
-u user | 指定使用者 | Crontab –u oldboy |
1.5指令的使用格式
默认情况下,用户所建立的crontab文件存于/var/spool/cron/目录中,其crontab对应的文件名与用户名一致.
格式共分为7段,前5段为时间设定段,第6段为以哪个用户执行crontab(默认是当前用户),第7段为所要执行的命令段.
格式如下:
01**** root run-parts /etc/cron hourly
024***root run-parts /etc/cront daily
224**0root run-parts /etc/cron weekly
4241**root run-parts /etc/cron monthly
1.5.1crontab时间段的含义如表:
段 | 含义 | 取值范围 |
第一段 | 代表分钟 | 00-59 |
第二段 | 代表小时 | 00-23 |
第三段 | 代表日期 | 01-31 |
第四段 | 代表月份 | 01-12 |
第五段 | 代表星期几,0代表星期日 | 0-6(这里为了记忆忽略7) |
1.5.2特殊符号含义如下表:
特殊符号 | 含义 |
* | 表示任意时间都,如0023***command表示无论何月何日何周的23:00执行任务. |
- | 减号,表示分隔符,表示一个时间范围段,如17-19点,每小时的00分执行任务.00 17-19 ***commond |
, | 逗号,表示分割时段的意思.30 17,18,19***/bin/sh /scripts/wj.sh每天的17点,18点和19点的半点时刻执行/scripts/wj.sh |
*/n | n代表数字,即”每隔n单位时间”,例如:每10分钟执行一次任务:*/10 ****command,其中*/10也可以写成0-59/10 |
1.6crontab依赖的服务
[root@hcf ~]# chkconfig --list|grep crond
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@hcf ~]# /etc/init.d/crond status
crond (pid 36919) is running...
[root@hcf ~]# /etc/init.d/crond restart
Stopping crond: [ OK ]
Starting crond: [ OK ]
1.7实例说明
[root@dockers ~]# crontab -l
* */1 * * * /bin/find /var/server/dev3/server/apache-tomcat-8.0.36/webapps/e-mall-* -type f|xargs chmod 674 2>/dev/null
* */1 * * * /bin/find /var/server/dev3/server/apache-tomcat-8.0.36/webapps/e-mall-* -type d|xargs chmod 775 2>/dev/null
* */1 * * * /bin/chown ylm. /var/server/dev3/server/apache-tomcat-8.0.36/webapps/e-mall-* -R 2>/dev/null
* * * * 6 /bin/find /var/server/dev3/server/apache-tomcat-8.0.36/logs/ -ctime +5 -type f|xargs -i rm -f {} >/dev/null 2>&1
在上例中除了数字与英文名称,还使用到了符号”*”,这个*号代表每一单位的意思.
第1列为分钟,特殊符号”/”表示每隔的意思,即每隔一分钟执行/bin/find /var/server/dev3/server/apache-tomcat-8.0.36/webapps/e-mall-* -type f|xargs chmod 674 2>/dev/null程序.
- 30 3,12***/bin/sh /scripts/wj.sh在本例中,其中的第1列为30,表示30分钟,第2列为3,12代表3点及12点,此定时任务的意思是每天凌晨3点和中午12点的半点时刻(或者每天凌晨3:30和中午12:30)执行/scripts/wj.sh
- 30 */6*** /bin/sh /scripts/wj.sh在本例中,其中的第1列为30,表示30分钟,第2列*/6代表每6个小时,也相当于6,12,18,24的作用,每隔6个小时的半点时刻执行后面的脚本任务
- 30 8-18/2 *** /bin/sh /scripts/wj.sh在本例中,其中的第1列为30,表示30分钟,第二列8-18/2代表在早晨8点到下午18点之间每隔2小时,也相当于8,10,12,14,16,18的作用,早晨8点到下午18点之间每隔2小时的30分时刻执行后面脚本
- 30 21***/application/apache/bin/apachectl graceful每晚的21:30重启apache
- 45 4 1,10,22**/application/apache/bin/apachectl graceful每月1,10,22日的凌晨4:45分重启apache
- 10 1** 6,0/application/apache/bin/apachectl graceful每周六周日的凌晨1:10分重启apache
- 0,30 18-23***/application/apache/bin/apachectl graceful每天18点到23点的0分和30分时重启apache,提示:最后一次执行任务是23:30分
- 00 */1 ***/application/apache/bin/apachectl graceful每隔1小时整点重启apache
- * 23-7/1 ***/application/apache/bin/apachectl graceful晚上23点到早上7点之间,每隔1小时重启apache 提示:以上结果是不对的,为什么?以上定时任务的第一列为*,表示每分都执行任务即表示晚上23点到早上7点之间,每小时的每分钟都重启apache,很可怕.
- 0 11 * 4 1-3/application/apache/bin/apachectl graceful4月的每周一到周三的11点重启apache
1.8crontab命令生产环境专业写法
把所有的任务,写入到一个可执行文件(shell编程),由crond调用执行文件.
例1:每分钟打印一次自己的名字到/server/log/自己的名字命名的文件中.
答案:
#print char task by wj for programmer A at 2010-12-12
*/1 **** echo “wj” >>/server/log/wj.log 2>&1
例2:每周六、日上午9:00和下午14:00去学习linux运维
答案:
#cron job for ett by wj 2010-12-12
00 9,14 **6,0 /bin/sh /server/script/wj.sh>dev/null 2>&1
针对以上两生产例子说明:
- 写定时任务要写清注释是个好习惯,如:什么人,什么时间,因为谁,做了什么事.都标记
清楚了,这样其他维护人员可以很容易理解.如wj于2016-12-12日在A服务器上做了每10分钟同步时间的操作(如果是开发的任务可以写上需求人).
- 执行任务时可以省略用户,在执行脚本时,尽量带上/bin/sh,否则有可能脚本没执行
权限而无法执行.
- 需要root权限执行的任务可以登录到root用户下然后设置,如果不需要root权限,
可以登录到普通用户下,然后设置.这里要特别注意不同用户的环境变量问题,如果是调用了环境变量(如生产场景java脚本),此时,最好在脚本中将环境变量重新export下.
- 定时任务命令的结尾最好加上>/dev/null 2>&1等内容,如果需要打出日志,可以追加到
指定的日志里,不推荐留空这种不专业的做法.
其中,/dev/null为特殊的设备,表示黑洞设备或空设备.2>&1使标准错误和标准输出一样,本命令内容即把脚本的输出重定向到/dev/null,即不记录任何输出,也不给系统发邮件.
如果定时任务不加>/dev/null 2>&1等命令配置,时间长了,可能会导致邮件临时目录/var/spool/clientmqueue文件数猛增,占用大量磁盘空间.
提示:上面写法也可以写成1>/dev/null 2>/dev/null,例子 $JAVA-jar
$RESIN_HOME/lib/resin.jar$ARGS stop 1>/dev/null 2>/dev/null来自resin默认启动脚本
- 在开发定时任务程序或脚本时,在调试好脚本程序后,应尽量把DEBUG及屏幕输出的内
容的命令去掉,如果还需要,可定向到日志里.
1.9crontab生产解决案例
案例1:no space left on device故障1
在设置crontab时提示No space left on device,用df –k 检查还有空间,用df –i显示/var已占用100%,如果inode耗尽,则系统上将不能创建文件.
在/var/spool/clientmqueue/下有超多的文件,ls半天没反应,用rm –rf *会自动跳出root,然后用xargs来配合解决.cd /var/spool/clientmqueue&&ls|xargs rm –f
最后清理了该目录中的内容.当然,如果文件数超多,执行ls|xargs rm –f也会长时间无反应,此时,也可以直接cd /var/spool&&rm -rf clientmqueue,然后mkdir clientmqueue&&chmod 770 clientmqueue && chown smmsp.smmsp –R /var/spool/clientmqueue。系统中/var/spool/clientmqueue目录默认权限为:
原因分析:系统中cron执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就产生了这些文件;
解决办法:开启邮件服务,并将crontab里面的命令后面加上>/dev/null 2>&1,在做定时脚本时,把屏幕输出定向到日志中.
案例2:No space left on device 故障2
1.wnen you create a new directory or file ,system will say :no space left on device
mkdir ett
mkdir:cannot create directory ett:No space left on device
2.when create crontab for account ett,you will receiveerror information as follows:
“Crontab.6655” 1L
Crontab:installing new crontab
Cron /tmp.6655:No space left on device
Crontab:edits left in /tmp/crontab.6655
解决过程:
- 检查分区使用率:df –lk使用最多分区/var的使用率只有79%,硬盘空间还够用.
- 检查/var/lock下的文件,删除/var/locks/subsys/nfs后,touch /var/ett,成功创建文件,删除/var/ett
- 发现删除/var/lock下的任意一个文件后,都可以成功创建一个文件,再创建就会失败.
Touch /var/ett 成功 touch /var/ett1失败
Touch:creating ett1:No space left on device.
- 将检查扩大到/var下的其他目录
cd /var/www/icons mv a.gif /tmp mv a.png /tmp --------移走两个文件
df –li touch ett touch bb touch cc
touch:creating cc:No space left on device ------------只能创建两个文件,当创建第三个文件时,出错
- 怀疑分区/var的inode用尽导致上述问题,检查inode使用率
df –li
发现/var的inode使用率已经达到100%,空余的inode为0
- 分区/var没有配置quota,平均每个inode的占用空间为:497829k(var分区大小)/128520(inodes)=3.87k,说明分区的最小block为4k,无法增加inode限额.
- 发现/var/spool/clientmqueue下面有太多的文件,共有127679个,占用了127679/128520(inodes)=99.3%的inode节点数,由于系统 的邮件服务配置有问题,导致系统发出的邮件堆积在队列目录中,占用的大量的inode节点.
处理方法:确认/var/spool/clientmqueue下的文件已经无用后,删除之.然后/var写
入正常.
最好的解决办法是重新设置系统邮件,使其能正常发送或找到发邮件的源头,如
本文的crontab任务.
删除文件后的inode使用情况. df –li
案例3:No space left on device 故障还原
本案里借鉴了http://blog.sina.com.cn/s/blog_4dd475390100c47m.html文章,并进行了实践还原故障.