Linux---定时任务调度常用指令

本文深入探讨了Linux系统中定时任务调度的实现方法,包括crontab的基本用法、任务格式解析、特殊符号的运用及实际操作案例。此外,还讨论了crontab的局限性,并提供了一种自定义脚本方案,用于实现更细粒度的任务调度需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

​ 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

 

 

参考文章:https://www.cnblogs.com/wansw/p/10788946.html

参考文章:https://blog.youkuaiyun.com/wsyzxss/article/details/83386725

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值