欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux任务计划,周期性任务执行

程序员文章站 2022-06-09 13:09:36
...

概述:什么是计划任务呢?就像我们每个人日常生活中都会使用到的闹钟一样,按时的去提醒该干什么事,以免忘记。同样,我们在工作中也要每天在特定的时间内安排一些事情,这就是计划任务。

未来的某时间点执行以此任务:at,batch
周期性运行某任务:cron

at命令

用法:at [option] TIME

TIME:
  HH:MM [YYYY-mm-dd]
  noon, midnight, teatime
  tomorrow
  now+#{minutes,hours,days,OR weeks}

示例:
(1)HH:MM 如 02:00
在今天的02:00进行,若该时刻已过,则明天此时执行任务
(2)HH:MM YYYY——MM——DD 如:04:00 2016-09-20
规定在某年某月的某一天的特殊时可进行该项任务
(3)HH:MM[am|pm] [Month] [DATE]
04pm March 17   17:20 tomorrow
(4)HH:MM[am|pm]+number[minutes|hours|days|weeks]
在某个时间点再加及各时间后才执行该项任务
now+5minutes  03pm+3days

常用选项:
  -q QUEUE:指明队列;
  -l:列出指定队列中等待运行的作业;相当于atq
  -d:删除指定的作业;相当于atrm
  -c:查看具体作业任务
  -f /path/from/somefile:从指定的文件中读取任务;
  -m :强制at发送邮件,表示执行完毕;
注意:作业的执行结果中的标准输出和错误输出以邮件形式通知给相关用户;

Linux任务计划,周期性任务执行

batch命令

让系统自行选择空闲时间去执行此处指定的任务;

周期性任务计划:cron

向crond提交作业的方式不同于at,它需要使用专门的配置文件,此文件有固定格式,不建议使用文本编辑器直接编辑此文件,要使用crontab命令,可以检查语法是否有错误。

相关的程序包
cronie:主程序包,提供了crond守护进程及相关辅助工具;
cronie-anacron:cronie的补充程序,用于监控cronie任务执行状况;如cronie
中任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务;
crontabs:包含Centos提供系统维护任务;

确保crond守护处于运行状态:
  CentOS 7: systemctl status crond
  CentOS 6: service crond status
计划要周期性执行的任务提交给crond,由其来实现到点运行。
系统cron任务:系统维护作业  手动编辑/etc/crontab
用户cron任务:crontab命令

系统cron任务

[aaa@qq.com yum.repos.d]# cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin   #注意命令路径
MAILTO=root
HOME=/
# For details see man 4 crontabs
# 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

* * * * *:定义周期性时间;
user-name:运行任务的用户身份;
command to be executed:要执行的任务

此处的环境变量不同于用户登录后获得的环境变量,因此,建议命令使用绝对路径。

例如:晚上910分运行echo命令:
10 21 * * * gentoo /bin/echo “Hello“

时间表示法:
(1)特定值:给丁时间点有效取之范围内的值;
(2) * :给定时间上有效取值范围内的所有值;表示“每。。。“
(3)离散取值:,   #,#,#4)连续取值:-    #-#5)指定时间范围上,定义步长: /#:#即步长

例如:每3小时echo命令
0 */3 * * * gentoo /bin/echo “hello“

用户cron
crontab命令定义,每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME

crontab [-u user] [-l | -r | -e] [-i]
  -l: 列出所有任务;
  -e: 编辑任务;
  -r: 移除所有任务;
  -i: 同-r一起用,以交互式模式让用户有选择的移除指定任务;
  -u user:仅root可运行,代为为指定用户管理cron任务;

注意:运行结果以又见通知给相关用户:
  (1) COMMAND > /dev/null
  (2) COMMAND &> /dev/null
  对于cron任务来讲,%有特殊用途;如果要在命令中使用%,则需要转义;
  不过,如果把%放置于单引号中,也可以不用转义。
思考:(1)如何实现秒级别运行任务?
      * * * * * for min in 0 1 2; do echo "hi"; sleep 20; done
     (2)如何实现每7分钟运行一次任务?

sleep命令: sleep NUMBER[SUFFIX]...
    SUFFIX:s:秒,默认 m:分钟 h:小时 d:天

练习:
1 每小时备份一次/etc目录至/backup目录中,保存的文件名称格式为“etc-yyyy-mm-dd-HH.tar.xz“;
0 * * * * /bin/tar -czf /backup/etc-date +%F-%H.tar.gz /etc &> /dev/null

2 每周2,4,7备份/var/log/messagees文件至/logs目录中,文件名型如“messages-yyyymmdd“;
0 0 * * 2,4,7 /bin/cp -a /var/log/messages /logs/messages-date +%Y%m%d &>/dev/null

3 每两个小时取出当前系统/proc/meminfo文件中以S或者M开头的信息追加至/tmp/meminfo.txt文件中;
0 /2 * * /bin/grep ‘^[SM]’ /proc/meminfo >> /tmp/meminfo.txt

4 工作日时间内,每小时执行一次“ip addr ahow“命令;
0 * * * 1-5 /sbin/ip addr show

相关标签: at crontab