前言

Linux---定时任务调度,指的是系统在某个时间段执行特定的命令或程序。

1、数据库的定时备份、同步抽取操作

2、系统定时触发的重复工作,如病毒扫描、黑名单更新扫描、重复进件

3、和Python脚本集合,执行定制化的监控功能,比如:每日、每周、每月的监控报表邮件等

crontab任务调度

用法

crontab 【选项】

crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数 

crontab -l //列出某个用户cron服务的详细内容 

crontab -r //删除某个用户的cron服务 

crontab -e //编辑某个用户的cron服务

service crond restart:重启任务调度

比如说root查看自己的cron设置:crontab -u root -l 
再例如,root想删除fred的cron设置:crontab -u fred -r 
在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e 
进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt

crontab -e
*/1 * * * * ls -l /etc > /tmp/to.txt  -- 每小时的每分钟执行
  • 第一个*:一小时中的第几分钟【0-59】
  • 第二个*:一天中的第几个小时【0-23】
  • 第三个*:一个月当中的第几天【1-31】
  • 第四个*:一年中的的第几月【1-12】
  • 第五个*:一周当中对的星期几【0-7 0和7都表示 周日】

特殊符号

说明

*

代表任意时间


不连续的时间范围,0 8,12,15 * * *,每天8、12、15点执行。

-

连续的时间范围,0 5 * * 1-6,周一到周六的凌晨5点执行。

*/n

每隔多久执行一次,/10 * * *,每隔10分钟执行一次。

示例

示例

含义

45 22 * * *

每天22点45分执行

0 17 * * 1

每周一的17点0分执行

0 5 1,15 * *

每月1、15号的凌晨5点0分执行

40 4 * * 1-5

每周一到周五凌晨4点40分执行

/10 4 * *

每天凌晨4点,每隔10分钟执行一次。5点就不执行了

0 0 1,15 * 1

每月1、15号、每周一的0点0分执行

实际操作

# run-parts

01 * * * * root run-parts /etc/cron.hourly //每小时执行/etc/cron.hourly内的脚本 

02 4 * * * root run-parts /etc/cron.daily //每天执行/etc/cron.daily内的脚本

22 4 * * 0 root run-parts /etc/cron.weekly //每星期执行/etc/cron.weekly内的脚本 

42 4 1 * * root run-parts /etc/cron.monthly //每月去执行/etc/cron.monthly内的脚本

30 21 * * * /usr/local/etc/rc.d/lighttpd restart   //表示每晚的21:30重启lighttpd

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart   //表示每月1、10、22日的4 : 45重启lighttpd

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart    //表示每周六、周日的1 : 10重启lighttpd 。

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart   //表示在每天18 : 00至23 : 00之间每隔30分钟重启lighttpd 。

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart     //表示每星期六的11 : 00 pm重启lighttpd 。

* */1 * * * /usr/local/etc/rc.d/lighttpd restart     //每一小时重启lighttpd

* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart      //晚上11点到早上7点之间,每隔一小时重启lighttpd

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart   //每月的4号与每周一到周三的11点重启lighttpd

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart   //一月一号的4点重启lighttpd

 

=================================================================================================

crontab是linux自带的计划任务程序,可以实现分,时,日,周,月。

但是crontab有两个缺陷:

1.最小粒度为分,对于秒不支持

2.若是上一个任务的执行时间超过下一个任务的开始时间的话,就会出现两个任务并行的现象,这样任务会越积越多,最后系统挂了。

这周在项目里需要实现每隔10秒去执行任务的功能,因此写了个shell程序:

1.可以自定义程序执行时间间隔,

2.使用的是deamon方式,产生两个进程,父进程监控子进程,若是子进程挂了,父进程重新启动子进程,子进程负责每隔10秒钟执行任务;

3.而且当任务执行时间超长时,不会出现两个任务同时执行的现象,下一个任务只会延后。也可以用后台运行方式运行任务,这样和crontab的效果一样

4.若是时间间隔为10秒,而任务只执行了1秒,则sleep 9秒后,执行下一次任务

5.若是把sleep改为usleep的话可以精确到微秒

1. #运行执行 sh /Application/sdns/trigger/task_crontab.sh >> /Application/sdns/log/crontab.log 2>&1
2.  
3. #要定时执行的脚本,注意:不使用后台运行,则若是超过10秒的话,下一次会延迟,若是使用后台执行的话,有可能出现两个任务并行的问题
4. dlc_cmdline="sh /Application/sdns/trigger/dotask.sh >> /Application/sdns/log/dotask.log";
5. #本shell脚本的执行路径
6. dlc_thiscmd="sh /Application/sdns/trigger/task_crontab.sh >> /Application/sdns/log/crontab.log 2>&1"
7. #任务执行时间间隔
8. dlc_task_timeout=10;
9. #是否后台执行deamon
10. is_deamon=$1;
11. #deamon,父进程
12. if [ "$is_deamon" == "--deamon" ]
13. then
14. echo "deamon start"
15. while [ 1 ]
16. do
17. date +"%F %T $dlc_thiscmd is started";
18. #调用子进程
19. $dlc_thiscmd
20. date +"%F %T $dlc_thiscmd is ended";
21. done
22. fi
23.  
24. #子进程的代码
25. while [ 1 ]
26. do
27. date +"%F %T $dlc_cmdline is started" ;
28. #记录本次程序开始时间
29. dlc_start_time=`date +%s`
30. #执行任务
31. $dlc_cmdline
32. #计算和时间间隔的差距
33. dlc_sleep_time=$(($dlc_task_timeout+$dlc_start_time-`date +%s`));
34. echo "sleep_time=[$dlc_sleep_time]";
35. #不够10秒,则sleep到10秒
36. if [ "$dlc_sleep_time" -gt 0 ]
37. then
38. sleep $dlc_sleep_time;
39. fi
40. date +"%F %T $dlc_cmdline is ended";
41. done