有一部分工作,需要某个时间开始,每天执行,每间断一段时间执行.
这个时候就需要了crontab.
crontab 管理着linux上一些定期的任务.log rotate,logwatch 等等
废话不多说来看crontab,
环境:Centos 6.6
[root@Centos etc]# crontab -h crontab: invalid option -- 'h' crontab: usage error: unrecognized option usage: crontab [-u user] file crontab [-u user] [ -e | -l | -r ] (default operation is replace, per 1003.2) -e (edit user's crontab) -l (list user's crontab) -r (delete user's crontab) -i (prompt before deleting user's crontab) -s (selinux context)
-e 是编辑crontab
-l 是列出来
-r 是删除
-i 删除前提示一下
-s selinux的东东..
1. 先来讲讲格式:
[root@HYG etc]# cat /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 00 01 * * * root /usr/sbin/ntpdate cn.pool.ntp.org >/dev/null 2>&1
☆ 分 时 日 月 周 命令
这个配置文件解释的也比较清楚了
★ ntp的这条crontab是我自己加的,/etc/crontab需要自己加上用户(user-name),crontab -e 命令的cron不需要加用户.写在/etc/crontab中的cron使用命令crontab -l 是看不到的.
★ 最小的时间间隔是分,所以只能控制到分钟了如果需求到秒的话可以脚本自行控制 sleep(10)
★ 权值,什么是权值 十进制 123 一百二十三 为什么是一百二十三 因为百位上是1 十位是2 个位是3, crontab 一样.分位代表的分钟,时代表着小时,依次类推(很多人这里很糊涂)
★ 特殊符:
* 代表任意,很多人不理解,什么叫任意.. 如果*在分钟位上,那么就是任意分钟.分钟有多少(0,1,2,3,……,59),任意就是每一分钟都可以触发.*就等价于 0-59
- 范围取值, (1-3) 就是1,2,3
, 间隔符,将不同的值区分开,没有其他的意义.
/ 步长,频率,间隔多久, 1-9/2 就是每间隔2, 等价于1,3,5,7,9
★ Centos 就这么几个特殊符号,没有#之类的其他符号(其他的定时可能会更多).
★ 周和日,月是或的关系,不是与.00 01 01 * 6 代表每月01号或者周六 01时执行.并不是每月01号并且是周六 01时执行,如果需要判断周几,可用脚本自行判断
2. 时间样例:
☆ 看看上边那个ntp的例子:每天,每月,1点 00分执行
☆ 反过来说一个, 每天的 3点,15点分别执行一次脚本:
* 3,15 * * * 看到很多人会是这种写法,这种写法是错的.因为隐藏掉了分钟的说法所以很多人都会理解为分钟是* 这样写的话是3点,15点的任意分钟执行脚本,3点就要执行60次脚本.
00 3,15 * * * 正确的写法,3,15点整执行
☆ 10 3,15 * * * 这样也算是对的,看你的需求了.3点10分的是执行.最好让所有的脚本都岔开执行.
☆ 00 3-5 * * * 范围都好理解 3点到5点 00分的时候执行 3:00 4:00 5:00 就会执行
☆ 00 5 */2 * * 5点整执行,现在不是每天了,是每隔一天,执行一天休息一天 这个/不太好理解.
☆ 1点到8点每小时执行,9-24点每2小时执行,05分的时候执行脚本
05 1-8,9-24/2 * * *
3. 命令添加crontab:
crontab -e 会进入一个vi的编辑界面:
00 01 * * * /usr/sbin/ntpdate cn.pool.ntp.org >/dev/null 2>&1
00 01 * * * /bin/bash /usr/locl/bin/test.sh >/dev/null 2>&1
前一段是时间 命令 参数
这里想说的是如果执行脚本就加上/bin/bash,并且脚本路径用绝对路径.保证有权限,
4. 来看看crontab的配置文件:
[root@Centos tmp]ls /etc/ | grep cron cron.d/ cron.daily/ cron.deny cron.hourly/ cron.monthly/ crontab cron.weekly/
crontab: 上边已经看过了.简单解释一下SHELL就是shell环境,PATH就是PATH变量,MAILTO邮件发给谁,HOME默认此 shell 的家目录所在
cron.allow: 将可以使用 crontab 的账号写入其中,若不在这个档案内的使用者则不可使用 crontab
cron.deny: 将不可以使用 crontab 的账号写入其中,若未记录到这个档案当中的使用者,就可以使用crontab。
cron.allow比cron.deny优先级高,一般我们都保留一个cron.deny 一个账号一行.
cron.weekly/ cron.monthly/ cron.daily/ cron.hourly/ 这几个目录里边放的是脚本,每天每月每天每小时,都会执行相应里边的脚本.所以每天执行一次的脚本也可以直接放到cron.daily里边.你也可以自己创建目录cron.min
*/2 * * * * root run-parts /etc/cron.min 使用run-parts
cron.d/ 这个是从crontab分裂出来,如果我们自己有编辑/etc/crontab配置文件的需求可以自己写在cron.d/下边,里边有几个样例自己可以看看.
5.使用命令crontab -e 编辑的cron存放在哪里(我之前编辑了几个crontab,如果你没有的话可以自己编辑几个crontab)
[root@Centos tmp]# ls /var/spool/cron/ root
以用户名为名命名的文件.
[root@HYG cron]# cat root 40-45,45-50/2 * * * * echo "abc">>/tmp/abc.txt
查看内容正是我们自己写的cron,我们写的cron 就保存在/var/spool/cron/ 并存在已用户名为名的文件.
[root@HYG cron]# echo " * * * * * echo hahaa >>/tmp/haha.txt" >>root
[root@HYG cron]# cat root
40-45,45-50/2 * * * * echo "abc">>/tmp/abc.txt
* * * * * echo hahaa >>/tmp/haha.txt
[root@HYG cron]# crontab -l
40-45,45-50/2 * * * * echo "abc">>/tmp/abc.txt
* * * * * echo hahaa >>/tmp/haha.txt
ls /tmp/
haha.txt
我们手动echo一条道root文件中. crontab -l 就可以直接查看到,并且不需要重启crontab
6. 重启crontab
service crond stop
service crond start
更多的详情可以查看鸟哥的私房菜里边写的比较全,也可以 man 5 crontab