Linux的计划任务
Linux系统需要频繁定期执行的任务包括:转移日志文件以避免装满文件系统,备份数据库以及连接时间服务器来执行系统时间同步等等。同时为了降低系统管理员的工作量,通过Linux的计划任务就可以实现这些需求。
Linux系统支持一些能够自动执行任务的服务我们称其为计划任务:
- at:指定一个时间执行一个任务
- cron:根据一个时间表自动执行任务
- anacron:在一个指定时间间隔错过后自动执行任务
at功能介绍
at服务:安排一个任务在未来执行
at服务需要系统后台有一个atd进程
[root@liusuping ~]# service atd start
启动 atd: [确定] //启动at服务
常用指令
at:安排延时任务
at命令的写法非常灵活:
- at 18:00pm July 9
- at 6 pm Monday
- at 2:00
- at noon + 5 minutes
回车后可以在之后的at>提示符下输入任务指令,完成后Ctrl+D存盘退出。
[root@liusuping ~]# at now //立刻执行的计划任务
at> echo welcome to liusuping.com >/root/liusuping //重定向内容
at> <EOT> //按Ctrl+D保存退出
job 9 at 2010-10-01 06:08
[root@liusuping ~]# cat /root/liusuping
welcome to liusuping.com
[root@liusuping ~]# clock
2010年10月01日 星期五 06时09分31秒 -0.106026 seconds[root@liusuping ~]# at 06:11 //制定06:11执行的计划任务
at> echo welcome to blog.liusuping.com >>/root/liusuping //追加内容
at> <EOT> //按Ctrl+D保存退出
job 10 at 2010-10-01 06:11[root@liusuping ~]# date
2010年 10月 01日 星期五 06:10:51 PDT[root@liusuping ~]# cat /root/liusuping
welcome to liusuping
welcome to blog.liusuping.com
atq:查询当前的等待任务
[root@liusuping ~]# date //显示当前时间
2010年 10月 01日 星期五 06:17:14 PDT[root@liusuping ~]# at 07:00
at> /bin/date //7点执行/bin/date
at> <EOT>
job 11 at 2010-10-01 07:00[root@liusuping ~]# atq //查询当前的等待任务
11 2010-10-01 07:00 a root
atrm:删除等待任务
[root@liusuping ~]# atrm 11 //删除上面的等待任务
[root@liusuping ~]# atq //查询当前的等待任务,没显示
利用/etc/at.allow和/etc/at.deny这两个文件可以限制用户对at的使用,在Linux中只有写在/etc/at.allow文件中的用户才可以使用at(即使不出现在/etc/at.deny中)
cron功能介绍
cron是一个可以用来根据时间、日期、月份、星期的组合来调度重复任务执行的守护进程要使用cron服务,需要vixie-cron RPM包,运行crond服务即可
[root@liusuping ~]# rpm -q vixie-cron //查看是否已经安装好软件包,默认装好了vixie-cron-4.1-76.el5
[root@liusuping ~]# service crond status //查看此服务是否启用
crond (pid 3121) 正在运行…
cron服务是通过crontab命令来设定的,crontab -e是针对用户的cron服务设计的,如果是由系统执行的计划任务,则不需要用crontab -e而只要编辑/etc/crontab这个文件。
cron服务每分钟不仅要读一次/var/spool/cron内的文件,而且要读一次/etc/crontab,因此可以通过该文件运用cron服务。
注意:用crontab配置针对的是某个用户的任务,而编辑/etc/crontab则针对的是系统的任务:
今天做一个定时执行脚本,手动执行可以达到预期效果,定时执行则不可以,搞了半天就是不执行,上网找了很多原因大概如下:
1、没有添加PATH
2、时间格式错误
但是两个都试了,还是没有解决。
通过尝试发现了原因:
1、在sh脚本中要用到mongo环境,在系统中也添加了mongo的环境变量,自动执行脚本则不成功。
修改办法:加上mongo的全路径 。如:/usr/local/mongodb3.0.3/bin/mongo 127.0.0.1:20000 /usr/local/MepReduce/gy_hotplace.js
2、把 mapReduce.sh脚本放到用户(root)的定时任务中不执行,放到系统的定时任务中则执行(怪!,现在这点还没搞懂)
[root@liusuping ~]# cat /etc/crontab //查看/etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //如果出现错误,或者有数据输出,那么该数据作为mail发给root
HOME=/ //使用者运行的路径,这里是根目录
# run-parts
01 * * * * root run-parts /etc/cron.hourly //每小时执行里头的脚本
02 4 * * * root run-parts /etc/cron.daily //每天执行里头的脚本
22 4 * * 0 root run-parts /etc/cron.weekly //每星期执行里头的脚本
42 4 1 * * root run-parts /etc/cron.monthly //每月执行里头的脚本
分钟(0-59)小时(0-24)天(1-31)月(1-12)周(0-7)用户名 脚本目录
cron服务是通过crontab命令来设定的:
- crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
- crontab -l //列出某个用户cron服务的详细内容
- crontab -r //删除某个用户的cron服务
- crontab -e //编辑某个用户的cron服务
默认脚本存放在/var/spool/cron/<username>
比如说root查看自己的cron设置:crontab -u root -l / crontab -l
再例如,root想删除liusuping的cron设置:crontab -u liusuping -r
在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e
进入vim编辑模式,编辑的内容一定要符合下面的格式:M H D m d cmd
- M: 分钟(0-59)
- H:小时(0-23)
- D:天(1-31)
- m: 月(1-12)
- d: 一星期内的天(0~6,0为星期天)。
cmd要运行的程序,程序被送入sh执行,这个shell只有USER,HOME,SHELL这三个环境变量
比如说,每天19:04显示问候信息:
04 19 * * * echo "good morning" >> /root/24.txt
[root@liusuping ~]# date
2010年 10月 01日 星期五 19:04:28 PDT
[root@liusuping ~]# cat /root/24.txt
good morning //测试使用而已
[root@liusuping ~]# crontab -l //查看计划列表
04 19 * * * echo "good morning" >> /root/24.txt
晚上11点到早上8点之间每两个小时提醒:
0 23-8/2 * * * echo "have a good dream " >> /root/24.txt
每个月的4号和每个星期的周一到周三早上11点执行某个命令:
0 11 4 * 1-3 command line
每个周六的11:00pm重启xinetd服务:
0 23 * * 6 /sbin/service xinetd restart
在 12 月内, 每天的早上 6 点到 12 点中,每隔3个小时执行一次 /usr/bin/backup :
0 6-12/3 * 12 * /usr/bin/backup
每月1号凌晨2点,清理/tmp目录下的文件:
0 2 1 * * rm -f /tmp/*
每年4月20号给twentyfour发信祝他生日快乐:
0 * 20 4 * root mail twentyfour@xx.com < echo "happy birthday to you 24"
注意:单纯是echo的话从屏幕是看不到任何输出的,因为cron把任何输出都email到root邮箱了,还有就是在修改完/etc/crontab之后,可能不会马上执行,可以重启服务/sbin/service crond restart ,因为crontab是读到内存中的。
crontab计划任务编写的步骤:
1、启动crontab服务
service crond start|restart
2、编写计划任务
crontab -e (具体如上,或者其它的方法)
service crond restart
3、查看cron日志。
tail -f /var/log/cron
cron的使用限制
默认情况下,所有用户都可以定制自己的守护任务,系统的守护任务只能由root来编辑限制/允许用户使用cron
/etc/cron.allow
/etc/cron.deny //系统默认只存在拒绝文件
如果系统中存在cron.allow,则只有在列在文件中的用户才可以使用crontab指令来定制自己的守护任务。如果系统中存在cron.deny,则列在文件中的用户不可以使用crontab指令来定制自己的守护任务,其他人可以。并且控制文件的格式是每行一个用户,不允许出现空格。