|  | 
 
| 
 cron 计划任务 子系统
 
 作用:  计划任务主要是做一些周期性的任务,目前最主要的用途是定期备份数据
 
 一、cron基础
 =============================================================
 # ps aux |grep cron |grep -v 'grep'       //-v 反向选择
 root      2936  0.0  0.0 117204  1272 ?        Ss   09:36   0:00 crond
 root      3780  0.0  0.0  17296   672 ?          Ss   10:01   0:00 /usr/sbin/anacron -s  //被crond唤醒
 crond进程每分钟检查一次,以运行相应的任务
 crond日志文件/var/log/cron
 
 
 二、系统级的计划任务
 =============================================================
 更新whatis数据库
 日志定期轮转
 清理/tmp,/var/tmp
 收集系统的状态信息
 ...
 
 定义方式一:
 # vim /etc/crontab    //自定义文件
 # 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
 
 *  *  *  *  *                 root      ls
 0  *  *  *  *                 root      ls
 0  2  *  *  *                root      ls
 0  2  1  *  *                 root      mysql_back.sh
 0  2  1  3  *                 jack      run-parts /cron-test   //执行该文件夹内的所有脚本
 
 
 定义方式二:
 # ls /etc/cron.hourly/     //该目录下脚本每个小时整点执行
 0anacron
 [root@datura ~]# ls /etc/cron.       //以下计划任务由anacron进程执行
 cron.d/       cron.deny     cron.monthly/
 cron.daily/   cron.hourly/  cron.weekly/
 
 
 anacrond:
 ========================================================
 /etc/anacrontab     //anacrond需要执行的系统级计划任务
 # vim /etc/anacrontab
 #period in days   delay in minutes   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   nice run-parts /etc/cron.monthly
 //执行频率               //延迟时间           //标签是否有执行  //执行命令
 
 anacron timestamp:/var/spool/anacron    //记录anacrond执行计划任务的时间戳
 # ls /var/spool/anacron/
 cron.daily  cron.monthly  cron.weekly
 # ls /etc/cron.daily
 00webalizer  certwatch  logrotate        mlocate.cron  readahead.cron  tmpwatch
 0logwatch    cups       makewhatis.cron  prelink       rhsmd
 # ls /etc/cron.weekly/   //没有内容
 # ls /etc/cron.monthly/
 readahead-monthly.cron
 [root@datura ~]# cat /var/spool/anacron/cron.daily
 20140327
 
 
 
 三、用户级的计划任务
 ============================================================
 # crontab -e                                        //创建计划任务
 * * * * * /bin/ls
 # crontab -l                                            //查看计划任务
 * * * * * /bin/ls
 # ls /var/spool/cron/         //查看有那些计划有计划任务
 root
 # cat /var/spool/cron/root //查看root用户的计划任务
 * * * * * /bin/ls
 # tail /var/log/cron                    //查看日志
 # crontab -u alice -e        //为其他用户设置计划任务只有管理员可以为其他用户设置
 
 
 作业语法格式:
 ===========================================================
 00 02 * * * ls                            //每天2:00整
 00 02 1 * * ls                          //每月1号2:00整
 00 02 14 2 * ls                        //每年2月14号2:00整
 00 02 * * 7 ls                          //每周日2:00整
 00 02 14 2 7 ls                 //每年2月14号2:00整  或者  每周日2:00整,这两个时间都执行
 
 00 02 * * * ls                            //每天2:00整
 *   02 * * * ls                                //每天2:00中的每一分钟
 * * * * * ls                                        //每分钟执行ls
 * * 14 2 * ls                                //2月14号的每分钟
 
 */5 * * * * ls                                //每隔5分钟
 00 02 1,5,8 * * ls                //每月1,5,8号的2:00整
 00 02 1-8 * * ls                        //每月1到8号的2:00整
 
 
 案例:备份etc目录,要求:
 ===========================================================
 1. 每天4:00备份/etc目录到/var/back
 2. 将备份命令写在脚本中,如/root/back.sh,加执行权限
 3. 每天备份的文件名包含当天的日期,如2012-11-09_etc.tar.gz
 4. 计划任务执行时,屏幕不产生任何输出 &>/dev/null
 5. 只保留最近5天的备份 find /var/back -mtime +5 |xargs rm -rf
 
 1. 编写脚本
 # vim /root/back.sh
 第一种版本
 tar -czf /var/back/`date +%F`_etc.tar.gz /etc
 find /var/back -mtime +5 |xargs rm -rf
 
 第二种版本
 #!/bin/bash
 filename=`date +%F`_etc.tar.gz
 back_dir=/var/back
 
 # 判断备份文件存放目录是否存在
 if [ ! -d $back_dir ];then
 mkdir -p $back_dir
 fi
 
 #备份
 tar -czf ${back_dir}/$filename /etc &>/dev/null
 
 #删除修改时间超过5天的文件
 cd ${back_dir}
 find . -mtime +5 |xargs rm -rf
 
 2. 手动测试脚本
 # chmod a+x /root/back.sh
 #  chattr +i /root/back.sh
 # ll /var/back/
 总计 11720
 -rw-r--r-- 1 root root 11984709 09-14 17:59 2014-01-16_etc.tar.gz
 # date 01171200
 # /root/back.sh
 # ll /var/back/
 -rw-r--r-- 1 root root 11984709 09-14 17:59 2014-01-16_etc.tar.gz
 -rw-r--r-- 1 root root 11984709 09-15 12:00 2014-01-17_etc.tar.gz
 
 3. 配置cron执行脚本
 # crontab -e
 0 4 * * * /root/back.sh
 # crontab -l
 0 4 * * * /root/back.sh
 
 4. 测试
 # date 09220359.50
 # date
 2013年 09月 22日 星期日 04:00:16 CST
 # ll /var/back/
 -rw-r--r-- 1 root root 11984709 09-22 04:00 2013-09-22_etc.tar.gz
 # tail /var/log/cron
 Sep 20 12:03:01 yangs crond[5873]: (alice) CMD (ls)
 Sep 20 12:03:42 yangs crontab[5870]: (root) REPLACE (root)
 Sep 20 12:03:42 yangs crontab[5870]: (root) END EDIT (root)
 Sep 20 12:03:46 yangs crontab[5880]: (root) LIST (root)
 Sep 20 12:04:01 yangs crond[5882]: (alice) CMD (ls)
 Sep 20 12:05:01 yangs crond[5895]: (alice) CMD (ls)
 Sep 22 04:00:20 yangs crond[5909]: (alice) CMD (ls)
 Sep 22 04:00:20 yangs crond[5912]: (root) CMD (/root/back.sh)
 
 
 扩展知识点: 让任务实现秒级执行
 ==============================================================
 一、通过计划任务实现
 每隔10秒执行命令date
 * * * * * date >/dev/pts/1
 * * * * * sleep 10; date >/dev/pts/1
 * * * * * sleep 20; date >/dev/pts/1
 * * * * * sleep 30; date >/dev/pts/1
 * * * * * sleep 40; date >/dev/pts/1
 * * * * * sleep 50; date >/dev/pts/1
 
 二、通过程序实现
 # vim while01.sh
 #!/bin/bash
 while :
 do
 echo "ok"
 sleep 5
 done
 
 
 
 | 
 |