【Linux】定时任务-crontab
1.1 定时任务crond介绍
crond是linux系统中用来定期执行命令/脚本或指定程序任务的一种服务或软件,一般情况下,安装完centos 6/7等linux操作系统之后,默认便会启动crond任务调度服务,crond服务也会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作,如果有,便会根据其预先设定的定时任务规则自动执行该定时任务工作,这个crond定时任务服务就相当于“闹钟”一样。
1.2 linux系统的定时任务
linux系统中定时任务调度的工作可分为以下两种情况:
一、 linux系统自身定期执行的任务工作:
系统周期性自行执行的任务工作,如轮询系统日志,备份系统数据,清理系统缓存等,这些任务无需我们人为干预。
[root@node1 ~]# ls -l /var/log/messages* # 系统的日志 -rw-------. 1 root root 36080506 9月 1 11:56 /var/log/messages -rw-------. 1 root root 26616060 8月 11 15:44 /var/log/messages-20190811 -rw-------. 1 root root 26112559 8月 19 10:23 /var/log/messages-20190819 [root@node1 ~]# ls -l /var/log/secure* # 用户登录日志 -rw-------. 1 root root 10021 9月 1 11:56 /var/log/secure -rw-------. 1 root root 15821 8月 11 14:44 /var/log/secure-20190811 -rw-------. 1 root root 9131 8月 19 09:51 /var/log/secure-20190819
二、用户执行的任务工作:
某个用户或系统管理员定期要做的任务工作,例如每天晚上0点对tomcat日志进行切割及备份数据库数据,一般这些工作都需要由运维自行设置才行。
实例:每晚0点对tomcat日志进行切割
[root@node1 ~]# crontab –l 0 0 * * * /bin/sh /server/scripts/tomcat_backup.sh >/dev/null 2>&1
用户执行的工作,也就是我们运维管理人员执行的任务工作,因此用户执行的任务是本篇文章的重点。
1.2.2 linux系统下的定时任务软件的种类
严格说,linux系统下的定时任务还真不少,例如:at,crontab,anacron
假如:某天晚上需要处理一个任务,仅仅是这一天的晚上,属于突发性的工作任务。要执行at命令,还需要启动一个atd的服务才行,在实际工作中,需要用到的时候几乎没有,因此此处也不详解。
crontab命令
正如前面所说的这个命令可以周期性的执行任务工作。
例如:每晚0点备份数据库数据。如果要执行crontab这个命令,也需要启动一个服务crond才行,此命令也是生产环境最常使用到的命令。
centos7系统 查看crond服务是否开机自启
[root@node1 ~]# systemctl list-unit-files |grep crond crond.service enabled
注:centos6系统应使用如下命令:
chkconfig –-list |grep crond
查看crond服务进程
[root@node1 ~]# ps -elf|grep [c]rond 4 s root 633 1 0 80 0 - 31555 hrtime 14:03 ? 00:00:00 /usr/sbin/crond -n
anacron:此命令主要用于非7*24小时开机的服务器准备的,anacron并不能指定具体时间执行任务工作,而是以天为周期或者在系统每次开机后执行的任务工作。
它会检测服务器停机期间应该执行,但是并没有执行的任务工作,并将该任务执行一遍。
小结:
- crond服务是运行的程序,而crontab是用来管理用户的定时任务(规则)的命令
- crond服务是企业生产工作中常用的重要服务,at和anacron可忽略使用方法
- 几乎每个服务器都会用到crond服务
1.3 定时任务crond使用说明
1.3.1 指令语法
crontab 【-u user】 {-l|-e|-r|-i}
查看系统帮助
man crontab
[root@node1 ~]# crontab --help crontab:无效选项 -- - crontab: usage error: unrecognized option usage: crontab [options] file crontab [options] crontab -n [hostname] options: -u <user> define user -e edit user's crontab -l list user's crontab -r delete user's crontab -i prompt before deleting -n <host> set host in cluster to run users' crontabs -c get host in cluster to run users' crontabs -s selinux context -x <mask> enable debugging default operation is replace, per 1003.2
crontab –l查看当前用户的定时任务配置
[root@node1 ~]# crontab –l 0 0 * * * /bin/bash /server/scripts/tomcat_log_cut.sh >/dev/null 2>&1 #tomcat日志切割
crontab –e进入当前用户的定时任务vim编辑模式
[root@node1 ~]# crontab –e #tomcat日志切割 0 0 * * * /bin/bash /server/scripts/tomcat_log_cut.sh >/dev/null 2>&1 ~ ~
crontab –u 用户名 –l查看指定用户的定时任务设置
[root@node1 ~]# crontab -u root –l #tomcat日志切割 0 0 * * * /bin/bash /server/scripts/tomcat_log_cut.sh >/dev/null 2>&1 [root@node1 ~]# crontab -u node1 -l no crontab for node1
1.3.2 指令说明
通过crontab我们可以在固定的间隔时间执行指定的系统指令或script脚本。时间间隔的单位可以是分钟,小时,日,月,周及以上的任意组合。(注意:日和周不要组合)
crond服务通过crontab命令可以很容易的实现周期性的日志分析或数据备份等企业运维场景工作
*/5 * * * * /bin/bash /server/scripts/tomcat_log_cut.sh >/dev/null 2>&1
说明:
五个星含义:
:分钟 /5代表每隔5分钟
:小时
:日
:月
:星期
/bin/sh /server/scripts/tomcat_log_cut.sh :需要执行的命令或脚本(命令必须全路径,可使用“which 命令”,查看命令路径)
1.3.3 使用者权限及定时任务文件
文件 | 说明 |
---|---|
/etc/cron.deny(拒绝) | 该文件中所列用户不允许使用crontab |
/etc/cron.allow(允许) | 该文件优先级高于cron.deny(默认不存在,一般不用) |
/var/spool/cron/ | 所有用户crontab配置文件默认都存在此目录,文件名以用户名命名 |
[root@node1 ~]# cat /etc/cron.deny node1 [root@node1 ~]# su - node1 [node1@node1 ~]$ crontab -l you (node1) are not allowed to use this program (crontab) see crontab(1) for more information [node1@node1 ~]$ crontab -e you (node1) are not allowed to use this program (crontab) see crontab(1) for more information [root@node1 ~]# [root@node1 ~]# ls /var/spool/cron/ root #默认是没有的,只有此用户创建了定时任务才有 [root@node1 ~]# cat /var/spool/cron/root 0 0 * * * /bin/sh /server/scripts/tomcat_log_cut.sh >/dev/null 2>&1 #tomcat日志切割
1.3.4 指令选项说明含义表
参数 | 含义 |
---|---|
-l(字母) | 查看crontab文件内容 |
-e | 编辑crontab文件内容 |
-r | 删除crontab文件内容 |
-u user | 指定使用的用户执行任务 |
==特别强调:-r参数在生产中很少用,也请各位慎用,使用时,请大家务必怀着对rm –rf 一样的态度,能够不用,就绝对不用!!!==
补充:
crontab{-l | -e }实际上就是在操作/var/spool/cron/当前用户这样的文件
使用crontab命令的优点:
- crontab 可以检查语法
- 输入方便
1.3.5 定时任务指令的使用格式
默认情况下,当用户建立定时任务规则后,该规则记录对应的配置文件会存在于/var/spool/cron中,其crontab配置文件对应的文件名与登录的用户名一致,如:root用户的定时任务配置文件为/var/spool/cron/root
crontab定时任务的书写格式很简单,用户的定时任务规则一般分为6个段(每个段通过空格来分隔,系统的定时任务为/etc/crontab,分为七个段,以空格来分割),前五段为时间的设定段,第六段为所要执行的命令或脚本任务段
[root@node1 ~]# cat /etc/crontab # example of job definition: # .---------------- minute (0 - 59) 分钟 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 星期 # * * * * * user-name command to be executed 分 时 日 月 周
1.3.6 crontab语法格式中时间段的含义如下表
段 | 含义 |
---|---|
第一段 | 代表分钟 |
第二段 | 代表小时 |
第三段 | 代表日,天 |
第四段 | 代表月份 |
第五段 | 代表星期,周几 |
==提示:时间记忆口诀:分时日月周。 取值范围口诀,正常日期时间范围。==
1.3.7 crontab语法格式中特殊符号含义如下表
特殊符号 | 含义 |
---|---|
* | *号,表示任意时间都,实际就是“每”的意思 |
- | 减号表示分隔符,表示一个时间范围,区间段,如17点到19点 例如:每天的17,18,19点的00分执行任务。00 17-19 * * * cmd |
, | 逗号,表示分隔时段的意思 例如:每天的5点和10点00分执行任务,00 5,10 * * * cmd |
/n | n代表数字,即“每隔n单位时间”。 例如:每10分钟执行一次任务可以写成 /10 * * * cmd ,其中,/10的范围是0-59,因此也可以写成0-59/10 |
1.3.8 图片说明crontab使用方法
1.3.9 用户定时任务实例
***** command 每1分钟执行一次command 3,15 ***** command 每小时的第3和第15分钟执行 3,15 8-11 * * * command 在上午8点到11点的第3和第15分钟执行 3,15 8-11 */2 * * command 每隔两天的上午8点到11点的第3和第15分钟执行 3,15 8-11 * * 1 command 每个星期一的上午8点到11点的第3和第15分钟执行 22 14 * * 0 command 每周日的14点22分执行 02 04 * * * command 每天4点的02分钟执行
1.4 附带说明
1.4.1 crontab书写格式说明
/dev/null 2>&1
实例
0 0 * * * /bin/sh /shell/tomcat_log.sh>/dev/null 2 >&1
解释
0是标准输入 使用<或<<
1是标准输出 使用>或>>
2是标准错误输出 使用2>或2>>
/dev/null 2>&1 即错误输出与标准输出全部重定向到空,可以写成1>/dev/null 2>/dev/null
关于重定向的作用
- 重定向到空可以避免碎片文件占用inode资源
- 重定向到一个指定log里,可以看任务是否执行
1.4.2 编写定时任务注意点
- 每个任务添加注释,谁写的,什么时间写的,完成什么需求
- 执行脚本使用/bin/sh(防止脚本无执行权限),要执行的文件路径是从根开始的绝对路径(防止找不到文件)
- 尽量把要执行的命令放在脚本里,然后把脚本放在定时任务里。对于调用脚本的定时任务,可以把标准输出错误输出重定向到空
- 定时任务中带
%
无法执行,需要加\转义 - 如果时上有值,分钟上必须有值
- 日和周不要同时使用,会冲突
-
>>
与>/dev/null 2>&1
不要同时存在
1.4.3 常见故障及解决方法
一、日期错误
crontab编辑后报错
crontab: installing new crontab "/tmp/crontab.qzzqun":1: bad minute
报错原因:crontab –e只写了命令,日期出现错误或者未填写
解决方法:crontab –e重新编辑定时任务,正确书写格式
二、inode号耗尽
设置crontab时提示:no space left on device
定位故障:
- 使用df –k检查还有空间
- 使用df –i显示/var已占用100%,如果inode耗尽,则系统上将不能创建文件
- 在/var/spoo/clientmqueue/有超多的文件ls半天没反应
- 使用rm –rf * 会自动跳出root,可使用xargs来解决
cd /var/spool/clientmqueue ls | xargs rm –f
故障分析:
系统中cron执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动就产生了这些文件
解决方法:将crontab里面的命令后面加上>/dev/null 2>&1
推荐阅读
-
spring boot定时任务接收邮件并且存储附件的方法讲解
-
详解MySQL用事件调度器Event Scheduler创建定时任务
-
springboot集成schedule实现定时任务
-
spring-boot通过@Scheduled配置定时任务及定时任务@Scheduled注解的方法
-
ScheduledExecutorService任务定时代码示例
-
Rabbitmq延迟队列实现定时任务的方法
-
Spring定时任务实现与配置(一)
-
Spring定时任务实现与配置(二)
-
Spring整合Quartz定时任务并在集群、分布式系统中的应用
-
SpringBoot中并发定时任务的实现、动态定时任务的实现(看这一篇就够了)推荐