Linux(定时任务)

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指令来定制自己的守护任务,其他人可以。并且控制文件的格式是每行一个用户,不允许出现空格。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值