Linux中执行定时任务,通常是通过crond
这个守护进程来完成的,用ps -ef | grep crond | grep -v grep
可以看到。它会从三个地方读取配置文件来进行后台任务的执行:
- /var/spool/cron/
${USER}
- /etc/crontab
- /etc/cron.d/*
这些配置文件记录了命令行以及执行周期等信息。下面来分别看看这三种类型的配置文件:
/var/spool/cron/目录下的配置
该目录下新建一个文本文件,并以当前用户名命名,比如当前是root账户登录,则vim root
,配置格式是这样:* * * * * 命令
第一个 * 代表每小时中的第几分钟(0-59)
第二个 * 代表每天的第几个小时(0-23)
第三个 * 代表每个月中的第几天(1-31)
第四个 * 代表每年的第几个月(1-12)
第五个 * 代表每周的星期几(0-7,0和7都代表星期日)
特殊符号,
代表不连续的时间。比如0 8,12,16 * * *
,就代表在每天的8点0分,12点0分,16点0分各执行一次。-
代表连续的时间范围。比如0 5 * * 1-6
,代表在周一到周六的凌晨5点0分执行命令*/n
代表每隔多久执行一次。比如*/10 * * * *
,代表每隔10分钟就执行一遍命令
例:
-
45 22 * * * 命令
在22点45分执行命令 -
0 17 * * 1 命令
每周1 的17点0分执行命令 -
0 5 1,15 * * 命令
每月1号和15号的凌晨5点0分执行命令 -
40 4 * * 1-5 命令
每周一到周五的凌晨4点40分执行命令 -
*/10 4 * * * 命令
每天的凌晨4点,每隔10分钟执行一次命令 -
0 0 1,15 * 1 命令
每月1号和15号,每周1的0点0分都会执行命令。注意:星期几和几号最好不要同时出现,因为他们定义的都是天。非常容易让管理员混乱。
案例*/1 * * * * echo 'hello' >> /tmp/a.txt
每隔一分钟向/tmp/a.txt中追加一行hello,可以使用tail -f /tmp/a.txt
观察
PS:使用
crontab -e
效果等同于
vim /var/spool/cron/${USER}
/etc/crontab配置
这个文件负责安排由系统管理员制定的维护系统以及其他任务的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
00 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
44 4 1 * * root run-parts /etc/cron.monthly
MAILTO=root
是说,当 /etc/crontab 这个档案中的例行性命令发生错误时,会将错误讯息或者是屏幕显示的讯息传给谁。
00 * * * * root run-parts /etc/cron.hourly
:在 #run-parts 之后的命令,可以看到,五个占位符后面接的是root,代表以root身份执行。而run-parts代表后面接的/etc/cron.hourly
是该目录内(/etc/cron.hourly)的所有可执行文件,也就是说,每个小时的00分,系统会以root身份去/etc/cron.hourly这个目录下执行所有可执行的文件,后面三行也是类似的意思。可以将每天需要执行的命令直接写到/etc/cron.daily即可,这样可以不使用crontab -e。
/etc/cron.d/目录下的配置
该目录用来存放任何要执行的crontab文件或脚本。
权限
查看/etc目录下有没有cron.allow或cron.deny文件,作用如下:
- 如果两个文件都不存在,则只有root用户才能使用crontab命令。
- 如果cron.allow存在但cron.deny不存在,则只有列在cron.allow文件里的用户才能使用crontab命令,如果root用户也不在里面,则root用户也不能使用crontab。
- 如果cron.allow不存在, cron.deny存在,则只有列在cron.deny文件里面的用户不能使用crontab命令,其它用户都能使用。
- 如果两个文件都存在,则列在cron.allow文件中而且没有列在cron.deny中的用户可以使用crontab,如果两个文件中都有同一个用户,以cron.allow文件里面是否有该用户为准,如果cron.allow中有该用户,则可以使用crontab命令。
crontab用法
crontab命令用于安装、删除或者列出用于驱动cron后台进程的表格。用户把需要执行的命令序列放到crontab文件中以获得执行。
- -l 在标准输出上显示当前的crontab。
- -r 删除当前的crontab文件。
- -e 使用VISUAL或者EDITOR环境变量所指的编辑器编辑当前的crontab文件。当结束编辑离开时,编辑后的文件将自动安装。