L017-linux系统定时任务crond入门小节
oh my god!how old are you?
怎么老是你?没错,我又来了,哈哈哈,今天是我的生日呢,在这么重要的日子里,必须要更一篇学习小节,OK,直奔主题!
首先呢,可以想一下,什么是程序?
其实要非常准确的答出来不是非常的好答出来的。
那么简单的说一下
答:我们使用的命令,就是程序,二进制程序。
基本特征:一堆代码,一个文件,一个命令。
程序是静态的,放在电脑里没有被运行。
程序存在于磁盘中
那么,进程又是什么呢?
简单的说把系统中的程序运行起来就是进程。
进程会存放在内存中
每个进程在启动时,系统会指定一个唯一的数字给每个进程,这个数字称为进程ID或者PID进程号
每个进程可能有两种方式存在:一个是前台,一个是后台
一般的系统网络服务都是以后台方式存在的,且都会常驻在系统中,直到关机或者主动杀死时才能停止(比如ssh远程连接服务,常称之为守护进程)
这时,crontab是时候出现了!
crond是什么?请往下慢慢看
crond是linux系统中用来定期执行命令或者指定程序任务的一种服务或者软件。
一般我们在装完C5/C6系统的时候,crond就会默认存在了。
我们优化开机自启动服务的时候,第一个就是crond。
crond默认情况(每分钟),会检查系统中是否有需要执行的定时任务,如果有,就会根据事先定义好的规则来执行这个定时任务。就好比生活中的闹钟一样。
但是需要注意的是crontab对于秒级的任务(以秒为单位定时任务)是无能为力的,如果需要可以自己尝试写守护进程(shell循环)或者使用Quartz,他可以实现秒级任务。
那么,为什么需要定时服务?
1.服务器:7*24小时开机提供服务是网站的基本特征。
2.有重要数据:1天备一次,5份以上
服务器上的数据一般最低1天备一次,每分钟(实时备份)再增量备份。
半夜备份:我们每天爬起来备份,然后睡觉,假设一次备份持续5小时。
基于这种情况,定时任务就产生了。定时任务可以实现帮助我们自动哦那个备份数据。
crond服务====闹钟(某种意义上)
linux定时任务分类:
1.系统自身的定期执行的任务
2.用户执行的任务
以下为系统管理的定时文件(可以了解一下,平时用的不多):
[root@moban logrotate.d]# ll /etc/ | grep cron*
-rw------- 1 root root 541 Nov 23 2013 anacrontab
drwxr-xr-x. 2 root root 4096 Mar 23 11:12 cron.d
drwxr-xr-x. 2 root root 4096 Mar 17 14:41 cron.daily
-rw------- 1 root root 0 Nov 23 2013 cron.deny
drwxr-xr-x. 2 root root 4096 Mar 17 14:41 cron.hourly
drwxr-xr-x. 2 root root 4096 Mar 17 14:41 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
查看我目前机器的定时任务(后面的5行都是我自己加的):
[root@moban logrotate.d]# crontab -l
*/5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1
#######*/1 * * * * cat /root/123.txt
#######*/1 * * * * for n in `seq 5`;do touch $n.txt;done
#######*/1 * * * * ll
*30 *9 * * *0 /root/oldboy.sh
*/5 * * * * ntpdate time.windows.com
linux下的定时任务分类:
1)at 适合执行一次就结束的调度任务,每天晚上。了解即可。
依赖服务:atd
[root@moban logrotate.d]# chkconfig --list atd //因为都是用crontab,所以都装机完成后关掉
atd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
2)anacron 适合于非7*24小时的开机的服务器准备的。开机执行的,检测停机期间没有执行的任务,在开机后一次性执行一遍。(因为工作中大多数的服务器都是7*24小时开机,所以这个定时任务的作用意义不大)
3)crond,crond服务默认情况(每分钟),会检查系统中是否有需要执行的定时任务,如果有就会根据事先定义好的规则来执行这个定时任务。
依赖的服务:crond(开机自启动)
提示:我们说的crond是一个定时任务的守护进程,而crontab是一个命令,是用户用来设置定时任务规则的命令。几乎每个服务器都会用到crond服务。
下面着重的了解一下crontab吧
crontab
参数:
-l 显示列表
-e 编辑定时任务
-r 删除,用的比较少
-i 出现确认信息
我们常用crontab -l来查看定时任务信息,那么crontab文件是存在哪里呢?
[root@moban cron]# cat /var/spool/cron/root
*/5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1
#######*/1 * * * * cat /root/123.txt
#######*/1 * * * * for n in `seq 5`;do touch $n.txt;done
#######*/1 * * * * ll
*30 *9 * * *0 /root/oldboy.sh
*/5 * * * * ntpdate time.windows.com
由上可以看出,其实就是在cron文件夹下,有一个用户名称的文件,每个账号的定时任务就存在对应文件里面。同理,crontab -e编辑的也就是这个文件。
下面这两个基本不用,因为本身系统权限的设置,超级用户可以给他的命令本身就给了,不给的他用循环也一样做不了。
/etc/cron.deny 该文件中所列用户不允许使用crontab命令
/etc/cron.allow 该文件中所列用户允许使用crontab命令,优先于/etc/cron.deny。
下面是定时任务的使用指定格式:
# 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
简单点儿记就是分时日月周
*代表每的意思
这节课基本上就是这么多啦,内容其实跟前两节课一样,不多!
下面就是老师在课上出的题了。巩固练习一下。
第一部分-练习定时格式:
①30 3,12 * * * /bin/sh /scripts/oldboy.sh
每天凌晨3点半和中午12点半的时刻执行/scripts/oldboy.sh脚本
②30 */6 * * * /bin/sh /scripts/oldboy.sh
每6小时30分执行一次/scripts/oldboy.sh脚本
③30 8-18/2 * * * /bin/sh /scripts/oldboy.sh
在每天的8点到18点之间,每隔2小时的 半点时刻执行/scripts/oldboy.sh
④30 21 * * * /application/apache/bin/apachectl graceful
每天晚上9点半重启apache
⑤ 45 4 1,10,22 * * /application/apache/bin/apachectl graceful
每月1日10日22日的4点45分重启apache
⑥ 10 1 * * 6,0 /application/apache/bin/apachectl graceful
每周六和周日的凌晨1点10分重启apache
⑦ 0,30 18-23 * * * /application/apache/bin/apachectl graceful
每天的18点到23点每隔30分钟重启一次apache。
提示:最后一次执行任务时23:30分
⑧ 0 */1 * * * /application/apache/bin/apachectl graceful
每小时重启一次apache
####⑨ * 23,00-07/1 * * * /application/apache/bin/apachectl graceful
每天的23点与0-7点之间每分钟重启一次apache
⑩ 00 11 * 4 1-3 /application/apache/bin/apachectl graceful
每年的4月份每周的周1到周3每天的11点整重启一次apache
//一般周和日尽量不要同时用,否则可能达不到想要的效果
第二部分-实际练习:
1.5月5日上午9点去老男孩培训上课。规则为:
00 9 5 5 * 去老男孩儿培训上课
2.每周日,上午9:30 去老男孩培训上课。规则为:
30 9 * * 0 去老男孩儿培训上课
3.每分钟打印一次自己的名字拼音全拼到“/server/log/自己的名字命名的文件”中。
答:
方法一:
[root@moban log]# crontab -e
*/1 * * * * echo lichaoran >> /server/log/lcr.txt
方法二:
* * * * * echo lichaoran >> /server/log/lcr.txt
4.每周六和周日 上午9点和下午14点来老男孩linux培训学习(/server/scripts/oldboy.sh)。
答:
[root@moban log]# echo "date +%F" > oldboy.sh
[root@moban log]# crontab -e
0 9,14 * * 6,7 /bin/sh /server/log/oldboy.sh >/dev/null 2>&1 //脚本最好是复制命令行执行过的或者把定时任务的脚本再复制到命令行一遍。而且要用绝对路径,防止出错。
执行sh前加/bin/sh
//定时任务(一般是脚本任务)规则的价位最好加上 >/dev/null 2>&1 等内容,如果需要打印纸,则可以追加到指定的日志文件里(此时不要和/dev/null同时存在),尽量不要留空
//超过两行的命令,最好用脚本,而不是直接在定时任务里写上命令。(非必须)
[root@moban ~]# cat /var/log/cron //所有定时任务所执行的命令日志都在这里面
最后,老师留了几道题,是课下的作业,已经做出来了,但是正确率不敢保证,先写上,下节课老师讲完了我再改错。
简答题:
1.每隔1分钟,打印一个+号到oldboy.log,请给出crontab完整命令。
*/1 * * * * /bin/echo echo "+" >> /server/log/oldboy.log
2.每隔2个小时将/etc/service文件打包备份到/tmp下(最好每次备份成不同的备份包)
[root@moban ~]# tar -czvf /tmp/$(date +%T)services.zip /etc/services //先写出程序测试是否有问题
[root@moban log]# echo "tar -czvf /server/log/$(date +%T)services.zip /etc/services" > beifen.sh //程序放到beifen.sh中
[root@moban log]# crontab -e
0 */2 * * * /bin/sh /server/log/beifen.sh
3.每天晚上12点,打包站点目录/var/www/html 备份到/data目录下(最好每次备份按时间生成不同的备份包)
这道题跟上题类似
[root@moban log]# tar -cvzf /root/$(date +%m-%d-%h)html.zip /var/www/html/.
[root@moban log]# echo "tar -cvzf /root/$(date +%m-%d-%h)html.zip /var/www/html/" >> /root/beifen.sh
[root@moban log]# crontab -e
0 0 * * * /bin/sh /root/beifen.sh
4.每周 六、日 上午9:00和下午14:00来老男孩儿这里学习(执行程序/server/script/oldboy.sh代替学习)
[root@moban log]# crontab -e
0 9,14 * * 6,7 /bin/sh /server/script/oldboy.sh /dev/null 2>&1
5.如果在莫用户的crontab文件中有以下记录,该行中的命令多久执行一次(RGCE考题)?()
30 4 * * 3 mycmd
A每小时。
B每周
C每年三月中每小时一次
答:这道题我选B
6.如果在某用户的crontab文件中有以下记录,该行中的命令多久执行一次(RHCE考试题)?()
*/5 * * * * mycmd
A每5分钟一次
B每小时过5分钟
C不会运行,格式无效
答:这道题我选A
最后的最后附一张神图:
2016年6月2日15:36:07
补充:
昨天最后的简答题是老师留的作业,然后呢发现错误是真是多啊,上面的很多地方都不对,现在就把标准答案,也就是我的笔记补充上吧。
1.每隔1分钟,打印一个+号到oldboy.log,请给出crontab完整命令。
昨天的解答:
*/1 * * * * /bin/echo echo "+" >> /server/log/oldboy.log >/dev/null 2>&1
问题:
a.没注释。不规范。
b.定时任务规则如果是命令,并且已经有从定向或者追加符号,一般要测试好加与不加>>/dev/null 2>&1 到控设备
c.要用绝对路径,也就是完整路径,且确保目录要存在才行,日志文件oldboy.log可以存在
d.要用>>追加,不是>覆盖,否则就算过了一天也只有一行而已。
还有一点因为前面已经有从定向了,所以后面不能加>/dev/null 2>&1了,会失效。
标绿为我做的有问题的地方
规范化答案:
#print a "+" every min by oldboy 13:20 2016-06-02
*/1 * * * * /bin/echo echo "+" >> /server/log/oldboy.log >/dev/null 2>&1
2.每隔2个小时将/etc/services文件打包备份到/tmp下(最好每次备份成不同的备份包)
昨天的解答:
[root@moban ~]# tar -czvf /tmp/$(date +%F-%H)services.zip /etc/services //先写出程序测试是否有问题
[root@moban log]# echo "tar -czvf /server/log/$(date +%F-%H)services.zip /etc/services" > beifen.sh //程序放到beifen.sh中
[root@moban log]# crontab -e
0 */2 * * * /bin/sh /server/log/beifen.sh
问题:
1、不要在根目录下打包。进入打包文件或目录的上级目录进行打包。
2、定时任务是按小时,打包里的日期也要精确到小时。
3、命令行操作成功是定时任务可以成功的大前提。把成功打包的命令放到文件脚本里执行。
4、tar的参数 -czvf中的v是输出,在执行脚本时不要加v。
5、规范脚本存放的目录
6、定时任务打包或者处理其他工作最好不要在屏幕输出。
7、从命令行到脚本的过程尽量复制,不用手敲。
8、测试打包的脚本是否正常。
9、命令行测试好。要用定时任务使用的完整命令测试。
10、执行脚本前面要加/bin/sh
11、* */2 * * * 的写法是每分,不是每两小时,一定要注意第一个*要变成0
12、命令放定时任务里不能有%,需要用“\”转义,所以都要放脚本里
规范化答案:
[root@moban ~]# tar -czvf /tmp/$(date +%F-%H)services.zip /etc/services //先写出程序测试是否有问题
[root@moban log]# vi /cron/beifen.sh //程序放到beifen.sh中
cd /etc/
tar -czvf /tmp/$(date +%F-%H)services.zip ./services
//保存退出
[root@moban log]# crontab -e
0 */2 * * * /bin/sh /cron/beifen.sh >/dev/null 2>&1
3.每天晚上12点,打包站点目录/var/www/html 备份到/data目录下(最好每次备份按时间生成不同的备份包)
昨天的解答:
[root@moban log]# tar -cvzf /root/$(date +%m-%d-%h)html.zip /var/www/html/.
[root@moban log]# echo "tar -cvzf /root/$(date +%m-%d-%h)html.zip /var/www/html/" >> /root/beifen.sh
[root@moban log]# crontab -e
0 0 * * * /bin/sh /root/beifen.sh
由于这个题跟上题类似,所以就直接贴出来答案:
[root@moban log]# tar -cvzf /root/$(date +%m-%d-%h)html.zip /var/www/html/
[root@moban log]# vi /cron/beifen2.sh
cd /var/www/
tar -czf /data/$(date +%m-%d-%h)html.zip ./html/
[root@moban log]# crontab -e
0 0 * * * /bin/sh /cron/beifen2.sh >/dev/null 2>&1
第四题就不贴啦,因为没什么问题,跟老师讲的一致。OK,就这样!