crontab 格式(Crontab语法规则格式、使用方式及日志查看)
一、Linux crontab定时执行任务 命令格式例子
基本格式:
*****command
分时日月周命令
第1列表示分钟1~59每分钟用*或者*/1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
crontab文件的一些例子:
30 21***/usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启apache。
45 4 1,10,22**/usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4: 45重启apache。
10 1** 6,0/usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1: 10重启apache。
0,30 18-23***/usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18: 00至23: 00之间每隔30分钟重启apache。
0 23** 6/usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11: 00 pm重启apache。
0*/1***/usr/local/etc/rc.d/lighttpd restart
每一小时重启apache
0 23-7/1***/usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启apache
0 11 4* mon-wed/usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启apache
0 4 1 jan*/usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启apache
名称: crontab
使用权限:所有使用者
使用方式:
crontab file [-u user]-用指定的文件替代目前的crontab。
crontab-[-u user]-用标准输入替代目前的crontab.
crontab-1[user]-列出用户目前的crontab.
crontab-e[user]-编辑用户目前的crontab.
crontab-d[user]-删除用户目前的crontab.
crontab-c dir-指定crontab的目录。
crontab文件的格式:M H D m d cmd.
M:分钟(0-59)。
H:小时(0-23)。
D:天(1-31)。
m:月(1-12)。
d:一星期内的天(0~6,0为星期天)。
cmd要运行的程序,程序被送入sh执行,这个shell只有USER,HOME,SHELL这三个环境变量
说明:
crontab是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user是指设定指定
user的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用-u user的话,就是表示设
定自己的时程表。
参数:
crontab-e:执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL环境变数
来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
crontab-r:删除目前的时程表
crontab-l:列出目前的时程表
crontab file [-u user]-用指定的文件替代目前的crontab。
时程表的格式如下:
f1 f2 f3 f4 f5 program
其中 f1是表示分钟,f2表示小时,f3表示一个月份中的第几日,f4表示月份,f5表示一个星期中的第几天。program表示要执
行的程序。
当 f1为*时表示每分钟都要执行 program,f2为*时表示每小时都要执行程序,其馀类推
当 f1为 a-b时表示从第 a分钟到第 b分钟这段时间内要执行,f2为 a-b时表示从第 a到第 b小时都要执行,其馀类推
当 f1为*/n时表示每 n分钟个时间间隔执行一次,f2为*/n表示每 n小时个时间间隔执行一次,其馀类推
当 f1为 a, b, c,...时表示第 a, b, c,...分钟要执行,f2为 a, b, c,...时表示第 a, b, c...个小时要执行,其馀类推
使用者也可以将所有的设定先存放在档案 file中,用 crontab file的方式来设定时程表。
例子:
#每天早上7点执行一次/bin/ls:
0 7***/bin/ls
在 12月内,每天的早上 6点到 12点中,每隔3个小时执行一次/usr/bin/backup:
0 6-12/3* 12*/usr/bin/backup
周一到周五每天下午 5:00寄一封信给 alex@domain.name:
0 17** 1-5 mail-s"hi" alex@domain.name/tmp/maildata
每月每天的午夜 0点 20分, 2点 20分, 4点 20分....执行 echo"haha"
20 0-23/2*** echo"haha"
注意:
当程序在你所指定的时间执行后,系统会寄一封信给你,显示该程序执行的内容,若是你不希望收到这样的信,请在每一行空一格之
后加上/dev/null 21即可
例子2:
#每天早上6点10分
10 6*** date
#每两个小时
0*/2*** date
#晚上11点到早上8点之间每两个小时,早上8点
0 23-7/2,8*** date
#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4* mon-wed date
#1月份日早上4点
0 4 1 jan* date
范例
$crontab-l列出用户目前的crontab.
二、Linux日志管理神器之Logrotate日志分割,以及crontab定时轮询
有些服务,会自动产生大量的日志文件,如果不限制,会占用磁盘空间。
如果单纯的用定时任务crontab删除,又不太灵活,这时需要日志神器logrotate。
logrotate工具是系统自带为了方便进行日志管理而产生的一个工具。
系统会定时运行 logrotate,一般是每天一次。也是基于定时任务crontab运行的。
配置文件:
主配置文件的位置在/etc/logrotate.conf,一般配置在/etc/logrotate.d/子目录下。
如系统默认日志配置:
配置文件参数:
更多信息请参考man logrotate帮助文档
模板是通用的,而配置参数则根据你的需求进行调整,不是所有的参数都是必要的。
在上面的配置文件中,我们只想要轮询一个日志文件,size=50M指定日志文件大小可以增长到 50MB,dateext指示让旧日志文件以创建日期命名。
可自行参考/etc/logrotate.d/目录下系统默认的文件。
logrotate命令:
具体 logrotate命令格式如下:
要为某个特定的配置调用 logrotate:
排障过程中的最佳选择是使用-d选项以预演方式运行 logrotate。要进行验证,不用实际轮循任何日志文件,可以模拟演练日志轮循并显示其输出。
正如我们从上面的输出结果可以看到的,logrotate判断该轮循是不必要的。如果文件的时间小于一天,就会发生了。
强制轮循即使轮循条件没有满足,我们也可以通过使用-f选项来强制 logrotate轮循日志文件,-v参数提供了详细的输出。
个人项目配置:
项目每天可产生20G左右的日志,显示不能做每日轮询,所以额外需要添加定时任务做每小时,或者每隔多少分钟。
如果轮询日志异常报错如下:
error: skipping“” because parent directory has insecure permissions(It’s world writable or writable by group which is not“root”) Set“su” directive in config file to tell logrotate which user/group should be used for rotation.”
需要加 su root root选项。
同时添加定时任务:
定时任务说明:
第一条,每隔40分钟轮询执行一次logrotate任务。
第二条,每天凌晨4点删除前一天的日志,原因如下:
由于项目系统产生日志格式的原因,会导致以下情况:
如果昨天的分割到4个后(或者1,2,3),时间到第二天后,没法转储递增,会一直停留在4,没法删除,每天会有,久而久之,也会占用磁盘空间。所以需要定时删除。
设置完成
开启定时任务日志,以便查看定时任务是否执行。后续可取消。
重启rsyslog
三、Linux:crontab要点整理(表达式,转义,权限管理,日志)
摘要: Linux, crontab
整理crontab的使用,包括cron表达式,设置和删除任务,权限管理,查看日志
crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务
使用如下命令进行crontab服务的开启,关闭,重启,和状态查看
其中启动关闭需要root权限,所有用户可以查看状态例如
crontab通过设置cron表达式来让计算机识别如何定时调度任务,cron表达式的基本语法
前五个*分别代表分钟,小时,当月第几日,当年第几月,周几,最后的 command是要执行的任务语句,详情和取值范围见下图
其中*代表所有值,比如以下代表在每年9月27日17点07分执行一个命令,不限制周几
可见crontab最小颗粒度是以分钟级别进行调度,最粗级别是月,不限制年,因此至少每年执行一次。
在cron表达式中最后一个*代表周几,如果前面的*限死了日期,且周几这个位置不为*为一个给定值,必定可能和周几冲突,当发生冲突时两者为 OR的关系,即如果时间满足指定的日期,或者时间满足指定的周几,都会执行任务,举个例子
当天为9月27日,星期一,以上两条语句都会被执行,一个在当天的17点13分,一个在当天的17点17分,在/tmp/cron.txt文件中会先后写入两条记录
当周几这个位置设置为*时,无需关注冲突问题,即不对周几做限制
除此之外cron表达式支持一些特征符号配合阿拉伯数字来设置每个*,这样可以实现或,每隔,从,到的逻辑,分别对应三种常用符号,,/,-,分别解释如下
分别举几个例子
(1)17点43分和44分执行任务
(2)每隔2分钟执行任务
(3)从52分带56分一直执行任务,一共执行5次
下面来整理一波常用的cron表达式
目前已知的需要转义的是百分号%,尤其是在使用日期命令date做日期格式化时,否则无法在crontab中运行,因为%是crontab中的一个有意义的符号,应该这样设置带有百分号的command例如
如果不这样设置,也可以单独写在一个shell脚本中使用bash解释执行也能够正常运行
在当前用户下使用 crontab-e来编辑添加定时任务,第一次使用会显示no crontab for用户,然后选择一种编辑方式选择输入3回车,如果首次没有设置后期也可以在终端输入 select-editor进行设置
设置完成之后输入 crontab-e进入,该方法进入的是当前用户的crontab界面,新起一行即可写入cron表达式进行设置,例如
其中可以使用#注释掉某行,则该cron表达式不生效,编辑完成后输入 wq!进行保存关闭
一种直接的方式是使用 crontab-r,这种方法删除该用户下所有crontab任务,其他用户的任务不影响都不会被删除,慎用,如果只是要删除其中某一条任务,则直接进入编辑删除这一行即可
任务查看使用 crontab-l命令,该命令可以查看当前用户的crontab任务
一台linux机器上每个不同用户都有自己的crontab-e文件设置自己的定时任务,这些任务互不干涉运行在一台机器上,其中root用户可以在使用crontab-e的时候可以切换其他用户进行设定,比如
以上语句是在root下给test用户设置定时任务,如果是普通用户则报错没有-u权限
crontab-e是用户级别的,设置每个用户的自己的定时任务,/etc/crontab是系统级别的,设置系统例行的任务,/etc/crontab只有root用户有读写权限,普通用户只有读权限。
/etc/crontab相比于crontab-e多出环境变量的配置和用户名配置,由root用户统一给各个任务配置用户名,设置的环境变量对/etc/crontab下所有人任务生效,比如修改他的python的搜索路径为anaconda
这个设置只对/etc/crontab有效,对crontab-e的每个用户设置的任务无效
/etc/crontab中设置系统例行的定时任务
表示分别在小时,每天,每周,每月定时执行系统任务,其中 test-x/usr/sbin/anacron代表条件测试文件是否可执行,如果可执行忽略||后面的命令内容,这种情况下系统走 anacron,会读取/etc/anacrontab下的内容进行替代
可见机器调用 run-parts命令和/etc/cron.daily,/etc/cron.weekly,/etc/cron.monthly执行定时任务
既然linux支持不同用户设置自己的任务,则在一个地方/var/spool/cron/crontabs看到所有用户设置的任务,这个目录只有root有权限进入
目录下有三个文件,对应三个用户,root用户对这些文件可读可写,相当于跟crontab-e可以在这设置和修改任务,直接在里面编辑等同于切到某用户执行crontab-e
ubuntu下crontab默认没有日志文件,需要在配置中设置日志文件位置,配置文件位于/etc/rsyslog.d/50-default.conf将这一行注释取消
设置后重启rsyslog服务
下面看下一crontab日志的格式
日志中包括执行时间,主机名,用户,以及执行的任务信息,任务信息包括执行的用户cron的command以及设置编辑crontab的记录,表明在哪个时间执行了哪个用户的哪个命令语句。
其中这两行反应了报错信息
crontab执行脚本时是不会直接错误的信息输出,而是会以邮件的形式发送到你的邮箱里,这时候就需要邮件服务器了,如果你没有安装邮件服务器,它就会报这个错: No MTA installed, discarding output,解决方案是将错误内容写入文件,比如在command后面添加>>/var/log/cron.log 2>&1追加,如果是>就是覆盖了,则crontab历史日志每次都会被删除,例如
或者就写入其他目录下