前言
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