crontab是一个很方便的在unix/linux系统上定时(循环)执行某个任务的程序使用cron服务,用 service crond status 查看 cron服务状态,如果没有启动则 service crond start启动它,cron服务是一个定时执行的服务,可以通过crontab 命令添加或者编辑需要定时执行的任务:
也就是说:linux/unix系统如果想运行cron任务,得先启动crond服务;
5)重启crond服务
/etc/init.d/crond status #查看当前运行状态
/etc/init.d/crond restart #重启
/etc/init.d/crond reload #平滑重启
或者 servie crond restart
crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数 eg: crontab -u root
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除某个用户的cron服务
crontab -e //编辑某个用户的cron服务 //一般编辑当前登录用户,一个用户只有一个cor文件,并已用户名命名
比如说root查看自己的cron设置:crontab -u root -l
再例如,root想删除fred的cron设置:crontab -u fred -r
在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e
进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt
编辑/etc/crontab文件,在末尾加上一行: 30 5 * * * root init 6 这样就将系统配置为了每天早上5点30自动重新启动。
需要将crond设置为系统启动后自动启动的服务,可以在/etc/rc.d/rc.local 中,在末尾加上
service crond start
如果还需要在系统启动十加载其他服务,可以继续加上其他服务的启动命令。
比如: service mysqld start
基本用法:
1. crontab -l
列出当前的crontab任务
2. crontab -d
删除当前的crontab任务
3. crontab -e (solaris5.8上面是 crontab -r)
编辑一个crontab任务,ctrl_D结束
4. crontab filename
以filename做为crontab的任务列表文件并载入
crontab file的格式:
crontab 文件中的行由 6 个字段组成,不同字段间用空格或 tab 键分隔。前 5 个字段指定命令要运行的时间
分钟 (0-59)
小时 (0-23)
日期 (1-31)
月份 (1-12)
星期几(0-6,其中 0 代表星期日)
第 6 个字段是一个要在适当时间执行的字符串
例子:
#MIN HOUR DAY MONTH DAYOFWEEK COMMAND
#每天早上6点10分
10 6 * * * date
#每两个小时
0 */2 * * * date (solaris 5.8似乎不支持此种写法)
#晚上11点到早上8点之间每两个小时,早上8点
0 23-7/2,8 * * * date
#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * mon-wed date
#1月份日早上4点
0 4 1 jan * date
执行秒级任务:
*
*
*
*
*
/
bin
/
date >>
/
tmp
/
date.txt
*
*
*
*
*
sleep
10
;
/
bin
/
date >>
/
tmp
/
date.txt
*
*
*
*
*
sleep
20
;
/
bin
/
date >>
/
tmp
/
date.txt
*
*
*
*
*
sleep
30
;
/
bin
/
date >>
/
tmp
/
date.txt
*
*
*
*
*
sleep
40
;
/
bin
/
date >>
/
tmp
/
date.txt
*
*
*
*
*
sleep
50
;
/
bin
/
date >>
/
tmp
/
date.txt# backup mysql
00
01
*
*
*
mysqldump
-
u root
-
-
password
=
passwd
-
d mustang >
/
root
/
backups
/
mustang_$(date
+
%
Y
%
m
%
d_
%
H
%
M
%
S).sql
01
01
*
*
*
mysqldump
-
u root
-
-
password
=
passwd
-
t mustang >
/
root
/
backups
/
mustang
-
table_$(date
+
%
Y
%
m
%
d_
%
H
%
M
%
S).sql
一、cron在3个地方查找配置文件:
1、/var/spool/cron/ 这个目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名,比如tom建的crontab任务对应的文件就是/var/spool/cron/tom。
一般一个用户最多只有一个crontab文件。
二、/etc/crontab 这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab。
三、/etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。
四、权限
crontab权限问题到/var/adm/cron/下一看,文件cron.allow和cron.deny是否存在
用法如下:
1、如果两个文件都不存在,则只有root用户才能使用crontab命令。
2、如果cron.allow存在但cron.deny不存在,则只有列在cron.allow文件里的用户才能使用crontab命令,如果root用户也不在里面,则root用户也不能使用crontab。
3、如果cron.allow不存在, cron.deny存在,则只有列在cron.deny文件里面的用户不能使用crontab命令,其它用户都能使用。
4、如果两个文件都存在,则列在cron.allow文件中而且没有列在cron.deny中的用户可以使用crontab,如果两个文件中都有同一个用户,
以cron.allow文件里面是否有该用户为准,如果cron.allow中有该用户,则可以使用crontab命令。
或者:
在/etc/cron.deny中添加要拒绝的用户名,格式如下:
listen
nobody
noaccess
username1
username2
username3
.
2)允许用户访问crontab任务
在/etc/cron.allow中添加要允许的用户名,格式如下:
root
username1
username2
在crontab文件中如何输入需要执行的命令和时间。该文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令。
每个域之间使用空格或者制表符分隔。格式如下:
minute hour day-of-month month-of-year day-of-week commands
合法值 00-59 00-23 01-31 01-12 0-6 (0 is sunday) commands(代表要执行的脚本)
除了数字还有几个个特殊的符号就是"*"、"/"和"-"、",",*代表所有的取值范围内的数字,"/"代表每的意思,"/5"表示每5个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。
基本格式 :
*****command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
1)拒绝用户使用crontab任务
2)定期执行一个目录下的文件
在/etc/crontab中添加目录,格式如下:
01 * * * * root run-parts 目录
注:使用run-parts可定义定期执行的目录
4)限权测试
1>添加用户
[root@test ~]# useradd test
[root@test ~]# echo 123456 |passwd test--stdin #<==非交互模式创建密码
Changing password for user test.
passwd: all authentication tokensupdated successfully.
2>拒绝测试
[root@test ~]# cat /etc/cron.deny
test
[root@test ~]#
[root@test ~]# su - test
[test@test ~]$ crontab -e
You (test)are not allowed to use this program (crontab)
See crontab(1) for more information
在cron.deny中加入用户后,该用户没有权限编辑定时任务
3>允许测试
[root@test ~]# cat /etc/cron.allow
test
[root@test ~]# su - test
[test@test ~]$ crontab -e #<==test用户编辑成功
*/1 * * * * echo successful >/tmp/a.log
[test@test ~]$ crontab -l
*/1 * * * * echo successful >/tmp/a.log
在cron.allow中加入用户后,该用户能编辑定时任务
4>清空允许用户
[test@test ~]$ su - root
Password:
[root@test ~]# echo >/etc/cron.allow
[root@test ~]# su - test
[test@test ~]$ crontab -l #<==test用户连查看的权限都没有
You (test)are not allowed to use this program (crontab)
See crontab(1) for more information
[test@test ~]$ cat /etc/cron.deny
test
清空cron.allow允许用户后,该用户又被cron.deny拒绝,
得出结论:/etc/cron.allow优先于/etc/cron.deny配置
3、Crontab用法
[root@yang1 data]# crontab --help #<==注:crontab –l –e都是直接操作/var/spool/cron/下当前用户名的文件
usage: crontab [-u user] file #<==指定某用户如crontab –u yang2 –e,编辑yang2家目录下的crontab
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 deletinguser's crontab) #<==删除crontab文件内容,删前会有提示
-s (selinux context)
注:crontab –e 编辑定时任务,退出时可以检查语法,直接编辑/var/spool/cron/root不能。如果大批量添加任务,则使用echo追加。
cron执行的每一项工作都会被纪录到/var/log/cron这个日志文件中,可以从这个文件查看命令执行的状态。
4、Crontab命令的书写格式
* * * * * /bin/sh /scripts/yy.sh |
分 时 日 月 周 命令和文件路径 |
(00-59) (0-23) (1-31) (1-12) (0-6) |
所用符号表示意思 |
* 星号每的意思 |
- 减号连续一段时间,如:00 17-19 * * * cmd 每天下午17点,18点,19点执行一次命令 |
, 逗号多个时间段,如:00 10-11,17-19 * * * cmd 每天的上午10,11点整,下午的17,18,19点整执行一次命令 |
/n n代表数字,指每隔n时间执行一次,如: */2 * * * * cmd 每隔2分钟执行一次命令 |
1)举例:
30 12-16/2 * ** cmd
每天的中午12点到下午4点间,每隔2小时执行一次
其它如:小时上有值,则分钟上也要有值
*/1 * * ** echo yangrong >>/var/log/yy > /dev/null 2>&1
每隔一分钟把yangrong打印到yangrong1文件中,但该命令无法执行,因为>>与>/dev/null不可同时使用
2)/dev/null 2>&1解释
0是标准输入 使用<或<< |
1是标准输出 使用>或>> |
2是标准错误输出 使用2>或2>> |
>/dev/null 2>&1 即错误输出与标准输出全部重定向到空,可以写成1>/dev/null 2>/dev/null |
3)关于重定向的作用
重定向到空可以避免碎片文件占用inode资源
重定向到一个指定log里,可以看任务是否执行
4)关于导致磁盘inode满情况分析
定时任务执行成功or失败时,程序会向上层发送mail,由于平时工作中不打开sendmail功能,所以邮件会存储在临时目录/var/spool/clientmqueue,随着执行的任务次数多,文件也会越来越多,直到某一天,添加文件时,提示No space left on device,主要问题原因不在于垃圾文件会占很大空间,而在于每个文件会占用inode节点。(centos6.4默认不装sendmail,可能不会导致这个问题发生)。
所以crontab规则后需加 /dev/null 2>&1。
注:>> 与 >/dev/null 2>&1不可同时存在,不然无法执行
5、定时服务器时间同步
1)手动同步
[root@yang1 data]# which ntpdate
/sbin/ntpdate
[root@yang1 data]# /sbin/ntpdate time.windows.com
2)自动同步(使用定时任务)
#sync systime by yangrong at 2013-9-4
*/5 * * * * /sbin/ntpdate time.windows.com>/dev/null 2>&1
注:当局域网内的服务器足够多时(500+),则需自己在局域网搭建ntp server
6、写定时任务注意点:
掌握了下面7点,写定时任务就不在犯错。
序号 |
注意点 |
1 |
每个任务添加注释,谁写的,什么时间写的,完成什么需求? |
2 |
执行脚本使用/bin/sh(防止脚本无执行权限),要执行的文件路径是从根开始的绝对路径(防止找不到文件) |
3 |
尽量把要执行的命令放在脚本里,然后把脚本放在定时任务里。对于调用脚本的定时任务,可以把标准输出错误输出重定向到空。 |
4 |
定时任务中带%无法执行,需要加转义 |
5 |
如果时上有值,分钟上必须有值 |
6 |
日和周不要同时使用,会冲突 |
7 |
>>与>/dev/null 2>&1不要同时存在 |
书写举例:
#backup mysql byyangrong at 2013-9-4
30 4 * * * /bin/shtar_mysql.sh >/dev/null 2>&1
7、调试定时任务
一个任务不能轻易的直接推上线上服务器,需要在测试服务器上测试好。
序号 |
调试方法 |
1 |
增加频率调试任务,如:生产环境2小时一次,测试机2分钟一次 |
2 |
加快时间调试任务,如:生产环境1天后执行,则添加任务后修改设备时间 |
3 |
重定向到一个日志里,查看任务执行情况。一个是定时任务后加log,一个是脚本后加log |
4 |
环境变量可能导致问题 |
5 |
通过日志定位问题。 tail /var/log/cron |