Linux 中的定时处理 cron服务
cron服务
在LINUX中,周期执行的任务一般由cron这个守护进程来处理
当安装完操作系统后默认会安装此服务工具并且会自动启动crond,该进程会每分钟定期检查是否有要执行的任务,若有则执行。
cron服务运行的最小单位是分钟,也就是每分钟cron服务加载一次配置文件,所以我们不能实现每秒钟运行一次cron中的配置项.
cron服务启动或关闭
由于Cron 是Linux的内置服务,可以用以下的方法启动、关闭这个服务:
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置
cron任务文件(配置文件)
cron在3个地方查找配置文件,这些配置文件我们称之为crontab文件,其中包含了命令行及其调用时间
1. /etc/crontab (系统任务调度)
这个文件存着系统级的任务。它主要用来运行每日的(daily),每周的(weekly),每月的(monthly)的任务。一般不在此文件安装自己的任务
2. /etc/cron.d/
此目录下存放的是系统级任务的任务文件。
3. /var/spool/cron/ (用户任务调度)
此目录下存放各个用户的任务文件。各个用户的任务存放在以自已用户名为文件名的任务文件中。此文件中的指令行没有用户域。
cron日志文件
可以通过查看文件/var/log/cron查看任务的运行情况。
cron任务文件的编辑
1.可以直接到上面提到的三个位置直接编辑相关的crontab文件
2.也可以通过crontab -e命令进行编辑
通过crontab -e进行编辑,实际上就是编辑/var/spool/cron/目录下的当前用户或者指定用户(-u)的crontab文件(以用户名命名的crontab文件)
3.还可以通过添加file的方式,例如先编写cron脚本,命名为testFile.cron,脚本内容的格式和/etc/crontab文件给出注释格式一样,执行crontab testFile.cron;
crontab命令选项
crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
注:
-u user:用于设定某个用户的crontab,此参数一般由root来运行,不指定的默认情况下是当前登陆的用户
file:是命令文件的名字,表示file作为crontab的任务列表文件并载入crontab,若未指定将接受键盘上键入的命令
-e:进入当前用户的定时任务文件编辑模式
-l:显示当前用户的定时任务文件的命令列表
-r:删除当前用户的crontab文件,也可-u删除指定用户的
-i:在删除用户crontab文件时给确认提示
crontab –e : 修改/var/spool/cron目录下当前用户的 crontab 文件. 如果文件不存在会自动创建,文件名与用户名相同。可以使用-u选项修改指定用户的 crontab文件
crontab –l : 显示当前用户的 crontab 文件中的任务计划。 可以使用-u选项显示指定用户的 crontab文件
crontab -r : 删除当前用户的 crontab 文件。可以使用-u选项删除指定用户的 crontab文件
crontab -ir : 删除 crontab 文件前提醒用户。
cron文件语法与写法
每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令
每个域之间使用空格或者制表符分隔
{minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script}
minute: 区间为 0 – 59
hour: 区间为0 – 23
day-of-month: 区间为1 – 31
month: 区间为1 – 12. 1 是1月. 12是12月.
Day-of-week: 区间为0 – 7. 周日可以是0或7.
时间域,除了以上的数字可以填入,还可搭配符号一起:
# 星号(*):代表所有可能的值
# 逗号(,):可以用逗号隔开的值指定一个列表范围,eg:"1,3,5,7,9"
# 中杠(-):可以用整数之间的中杠表示一个整数范围,eg:"1-5",即表示"1,2,3,4,5"
# 正斜线(/):可以用正斜线指定时间的间隔频率,eg:"*/10"表示分钟的话即每十分钟执行一次
如果day_of_month和day_of_week同时存在,day_of_month和day_of_week是不能同时起作用的,或者说不是我想象中的and的关系,而是or的关系。
例如:在每个月的1~13号的周1,2,4,5的早上8点执行命令。
想当然的去写:
* 8 1-13 * 1,2,4,5 data>/opt/tmpFile/testCrontab
是达不到想要的效果,因为day_of_month 和 day_of_week 同时设置的情况下是or的关系,即会出现这样的情况,
每个月的1~13号会执行和所有的周1,2,4,5都会执行这条命令,显然这不是我们想要的结果。
处理方法是,将命令data>/opt/tmpFile/testCrontab单独写到一个脚本里面去,并在这个脚本里面加上对时间的判断
实例
每秒执行一次
最小执行单位为分钟,秒无法实现
每分钟执行一次
* * * * *
每小时执行一次
0 * * * *
每天执行一次
0 0 * * *
每周执行一次
0 0 * * 0
每月执行一次
0 0 1 * *
每年执行一次
0 0 1 1 *
每5分钟执行一次
*/5 * * * *
每2小时执行一次
0 */2 * * *
每3天执行一次
0 0 */3 * *
每3月执行一次
0 0 1 */3 *
每小时10分和15分执行一次
10,15 * * * *
每天1点和3点执行一次
0 1,3 * * *
每月1号和3号分别执行一次
0 0 1,3 * *
每年1月和3月分别执行一次
0 0 1 1,3 *
每年1月至3月分别执行一次
0 0 1 1-3 *
关于cron配置文件/etc/crontab
cron 的主配置文件是 /etc/crontab,它包括下面几行:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # For details see man 4 crontabs # Example of job definition: # .---------------- minute (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 sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed # run-parts 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly
前四行是用来配置 cron 任务运行环境的变量:
Shell 变量的值指定shell 环境(此处默认为 bash shell);
PATH 变量定义用来执行命令的程序路径;
cron 任务的输出被邮寄给 MAILTO 变量定义的用户名,如果 MAILTO 变量被定义为空白字符串(MAILTO=""),电子邮件就不会被寄出;
HOME 变量可以用来设置在执行命令或脚本时使用的主目录。
如在 /etc/crontab 文件中run-parts部分所示,它使用 run-parts 脚本来执行存在于 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 目录中的脚本,这些脚本被相应地按照预设时间在每小时、每日、每周、或每月执行。这些目录中的文件应该是 shell 脚本,并且具有可执行权限(chmod +x filename)。
如果某 cron 任务需要根据调度来执行,而不是每小时、每日、每周、或每月地执行,它可以被添加到/etc/cron.d目录中。该目录中的所有文件使用和 /etc/crontab 中一样的语法。