crond是Linux系统中用来定期执行命令或指定程序任务的一种服务(软件)。
crond服务默认情况是每分钟执行,服务会每分钟检查系统中是否有需要执行的定时任务,如果有,则根据事先定义好的规则来执行这个定时任务。
crond服务最小时间是分钟,秒级任务crond服务自身无能为力,但可通过方法来实现。
Linux如查要实现秒级任务的方法:
(1)自已写守护进程
(2)自己写shell循环
(3)Quartz来实现
(4)在crond服务中加入sleep 数字来实现
例:* * * * * sleep 3; /bin/date
7*24小时提供服务,是一般网站的基本特征。
重要数据需每天备份。
凌晨备份,持续是间长
ll /etc/ | grep cron
-rw-------. 1 root root 541 Nov 23 2013 anacrontab
drwxr-xr-x. 2 root root 4096 Jan 2 13:23 cron.d
drwxr-xr-x. 2 root root 4096 Jan 1 23:59 cron.daily
-rw-------. 1 root root 0 Nov 23 2013 cron.deny
drwxr-xr-x. 2 root root 4096 Jan 1 23:43 cron.hourly
drwxr-xr-x. 2 root root 4096 Jan 1 23:58 cron.monthly
-rw-r--r--. 1 root root 457 Sep 27 2011 crontab
drwxr-xr-x. 2 root root 4096 Sep 27 2011 cron.weekly
crontab -l
#time sync by mybjb at 2017-01-23
*/10 * * * * /usr/sbin/ntpdate 210.72.145.44 > /dev/null2>&1
chkconfig --list atd
atd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
at [参数] [时间]
at> 执行的指令
退出at命令 ctrl+d
-m :当指定的任务被完成之后,将给用户发送邮件,即使没有标准输出
-I :atq的别名
-d :atrm的别名
-v :显示任务将被执行的时间
-c :打印任务的内容到标准输出
-V :显示版本信息
-q :后面加<列队> 使用指定的列队
-f :后面加<文件> 从指定文件读入任务而不是从标准输入读入
-t :后面<时间参数> 以时间参数的形式提交要运行的任务
说明:在今日的 HH:MM 时刻进行,若该时刻已超过,则明天的 HH:MM 进行此任务。
ex> 04:00
说明:规定在某年某月的某一天的特殊时刻进行该项任务
ex> 04:00 2009-03-17
说明:规定在某年某月某日的某时刻进行该项任务
ex> 04pm March 17
说明:规定在某个时间点再加多少时间后才进行该项任务
ex> now + 5 minutes
ex> 04pm + 3 days
例1:三天后的下午 5 点锺执行 /bin/ls
# at 5pm + 3 days
at> /bin/ls
at> ctrl+d
例2:明天17点钟,输出时间到指定文件内
# at 17:20 tomorrow
at> date > /root/doiido.log
at> ctrl+d
会检测停机期间没有执行的任务,在开机后一次性执行一遍。
period delay job-identifier command
period — 命令执行的频率(天数)
delay — 延迟时间(分钟)
job-identifier — 任务的描述,在目录/var/spool/anacron中生成一个以job-identifier命名的时
间戳文件的名称,只能包括非空白的字符(除斜线外)。
command — 要执行的命令
/sbin/service anacron start 启动该服务
/sbin/service anacron stop 停止该服务
cat /etc/anacrontab
#period delay job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nicerun-parts /etc/cron.monthly
注:monthly 就是一个月( 30 天)
crond是守护进程,crondtab是命令
-e:编辑该用户的计时器设置(查看的文件是/var/spool/cron/<用户名称>,会进行语法检查);
-l:列出该用户的计时器设置(查看的文件是/var/spool/cron/<用户名称>);
-r:删除该用户的计时器设置;
-u <用户名称>:指定要设定计时器的用户名称。
a、配置文件: /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
HOME=/
# run-parts
51 * * * * root run-parts /etc/cron.hourly
24 7 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
前四行是用来配置crond任务运行的环境变量,
第一行SHELL变量指定了系统要使用哪个shell,这里是bash
第二行PATH变量指定了系统执行命令的路径
第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户
第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。
run-parts表示后面接的是文件夹,要执行该文件夹内所有脚本。如果不写run-parts,则要直接写命令或脚本的全路径。
b、查看/etc/crontab文件
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 beexecuted
a、配置文件:
所有用户定义的crontab文件都被保存在/var/spool/cron目录中。其文件名与用户名一致,
b、使用者权限文件如下:
/etc/cron.deny 该文件中所列用户不允许使用crontab命令
/etc/cron.allow 该文件中所列用户允许使用crontab命令
/var/spool/cron/ 所有用户crontab文件存放的目录,以用户名命名
c、查看root用户定时任务文件
cat /var/spool/cron/root
#time sync by myLinux93.85 at 2017-01-05
*/60 * * * * /usr/sbin/ntpdate 10.108.68.100 > /dev/null2>&1
a、系统定时任务规则格式分为7段,用空格分隔。
前5段为时间设定段,第6段为用户名,第7段为所要执行的命令或脚本任务。
b、基本格式:
* * * * * user cmd
c、说明:
cmd可以是命令或脚本的全路径,也可以是run-parts文件夹。
系统定时任务配置文件/etc/crontab只能由root用户修改。
a、用户定时任务规则格式分为6段,用空格分隔。
前5段为时间设定段,第6段为所要执行的命令或脚本任务。
b、基本格式:
* * * * * cmd # minute |hour | day of month | month | day of week | command
c、说明:
(i)cmd为要执行的命令或脚本,必须要写全口含路径。如/bin/sh /wddg/test.sh。
(ii)每段之间必须要有一个空格。
(iii)时间段记忆口决:分时日月周
(iv)周和日尽量不要同时用,否则可能达不到想要的效果。
(v)cmd命令最好在命令行用tab补全后复制,
d、符号含义:
*:星号,表示任意时间。
分位是*表示每分(等价于00-59),时位*表示每小时(等价于00-23),同理,每天,每月,每周。
00 23 * * * cmd 表示每天23:00执行cmd
-:减号,分隔符,表示一个时间范围或区间段。
如时位17-19表示每天17、18、19点。
00 17-19 * * * cmd 表示每天17:00、18:00、19:00分别执行cmd
,:逗号,表示枚举分隔时段,可以和“-”同时使用。
如17,20,22表示每天17点,20点,22点。
30 3-5,17-19 * * * cmd 表示每天3:30、4:30、5:30、17:30、18:30、19:30分别执行cmd
/n:n代表数字,表示每隔n单位时间。
如分位上是*/10,表示每10分钟,也可写为0-59/10
* */4 * * * cmd 表示每4小时执行一次cmd。
chkconfig --list crond
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
/etc/init.d/crond status
crond (pid 3170) isrunning...
root用户:
crontab -e
#每小时查看磁盘空间情况,写入/wddg/df.log文件中
00 * * * * /bin/df -h >> /wddg/df.log
指定用户:
crontab -u wddg -e
30 3,12 * * * /bin/sh /wddg/test.sh
30 */6 * * * * /bin/sh /wddg/test.sh
30 8-18/2 * * * /bin/sh /wddg/test.sh
30 21 * * * /var/apache/bin/apachectl graceful
45 4 1,10,22 * * /var/apache/bin/apachectl graceful
10 1 * * 6,0 /var/apache/bin/apachectl graceful
0,30 18-23 * * * /var/apache/bin/apachectl graceful
00 */1 * * * /var/apache/bin/apachectl graceful
* 23,00-07/1 * * * /var/apache/bin/apachectl graceful
这题的结果是不规范的,也是不对的。并不表示晚上23点和早上0-7点的每小时都重启apache服务。由于第1列是*,表示是每分钟都执行。
00 11 * 4 1-3 /var/apache/bin/apachectl graceful
crontab -e
#print name to /wddg/log/name.log
* * * * * /bin/echo 'wddg' >> /wddg/log/name.log
vi /wddg/printDate.sh
echo `date '+%Y-%m-%d'` >> /wddg/log/date.log > /dev/null2>&1 #%F也可以
crontab -e
#print date /wddg/log/date.log
00 09,14 * * 0,6 /bin/sh /wddg/printDate.sh
crontab -l
ll /var/log/cron*
-rw-------. 1 root root 280238 Jan 25 09:45 /var/log/cron
-rw-------. 1 root root 577110 Jan 1 03:16 /var/log/cron-20170101
-rw-------. 1 root root 585344 Jan 8 03:52 /var/log/cron-20170108
-rw-------. 1 root root 597732 Jan 15 03:49 /var/log/cron-20170115
-rw-------. 1 root root 593889 Jan 22 03:20 /var/log/cron-20170122
格式:什么人、什么时间、因为什么(需求方)、做了什么事。可以让人容易理解任务的信息,提升工作效率。
因为创建的新文件默认权限是644,有时候,忘了为脚本设置可执行权限(x),结果任务无法执行。加上/bin/sh可以保证任务正常执行。
a、标准输入输出设备
/dev/null:是系统的空设备(也就是黑洞)
0:表示标准输入
1:表示标准输出
2:表示标准错误
b、重定向
2>&1 :把标准错误重定向到标准输出
>/dev/null 2>&1等价于1>/dev/null 2>/dev/null也等价于&>/dev/null
c、邮件服务容易导致邮件临时目录中小文件过多
由于CentOS5.x默认安装并开启邮件服务,如查不加>/dev/null 2>&1,有可能产生大量输出信息,导致邮件临时目录/var/spool/clientmqueue文件数猛增,占用大量inode节点。CentOS6.x虽然默认不安装邮件服务,但有可能以后会手动安装邮件服务,也会导致上述问题。
具体过程如下:
当定时任务执行时,会根据/etc/crontab文件中MAILTO="root"这个配置选项给系统发一封邮件。Linux系统默认邮件服务是sendmail,经常是关闭的,所以定时任务发送的邮件就会临时堆在/var/spool/clientmqueue目录中,时间长了该目录下的小文件会有委多,导致inode消耗完了,无法写文件了。
d、文件过多时,rm –f * 删除会报文件过多错误,需用ls(或find )| xargs rm –f来删除。
e、定时任务执行的如果是命令,并肯已经有重定向或追加符号的,一般要测试一下加与不加>/dev/null 2>&1,看具体执行结果,有时是不行的。
超过2行的命令执行,最好写成脚本,在定时任务是执行脚本。
不规范写法:
* * * * * sleep 1;echo "abc" >>/wddg/test.log
规范写法:
vi /wddg/test.sh
sleep 1
echo "abc" >>/wddg/test.log
* * * * * /bin/sh /wddg/test.sh >/dev/null 2>&1
a、首先在命令行操作,成功后直接复制命令到脚本中,防止敲错。
b、然后,在命令行用定时任务中脚本的写法测试脚本正常后,再通过复制方式将脚本路径写入cron中。
c、最后,在测试环境中测试,通过后才在正式环境中规范部署。
/bin/sh /wddg/test.sh
示例:周三的凌晨2:00执行,这时可以把测试环境时间调整为周三的凌晨1:55分(不要太近,至少5分钟时差)。
可要脚本里输出日志,也可以输出到日志文件
已经有重定向或追加符号的,不加>/dev/null 2>&1,
一般情况下,定时任务只能少数系统环境变量,所以定时任务在调用环境变量时, 应在脚本中先加载系统环境变量
文件或先定义环境变量。
tail –f /var/log/cron*
如:直接命令行执行无问题,但放到定时任务就不行。此类问题主要是多看日志。