任务计划

通过任务计划,可以让系统自动的按时间或周期性任务执行任务

  • 未来的某时间点执行一次任务
    • at 指定时间点,执行一次性任务
    • batch 系统自行选择空闲时间去执行此处指定的任务
  • 周期性运行某任务
    • cron

1、一次性任务

at 工具

  • 由包 at 提供
  • 依赖与atd服务,需要启动才能实现at任务
  • at队列存放在/var/spool/at目录中,ubuntu存放在/var/spool/cron/atjobs目录下
  • 执行任务时PATH变量的值和当前定义任务的用户身份一致
at [option] TIME

-V             显示版本信息
-t time        时间格式 [[CC]YY]MMDDhhmm[.ss]
-l             列出指定队列中等待运行的作业;相当于atq
-d N           删除指定的N号作业;相当于atrm
-c N           查看具体作业N号任务
-f file        指定的文件中读取任务
-m             当任务被完成之后,将给用户发送邮件,即使没有标准输出
  • 作业执行命令的结果中的标准输出和错误以执行任务的用户身份发邮件通知给 root
  • 默认CentOS 8 最小化安装没有安装邮件服务,需要自行安装
#TIME:定义出什么时候进行 at 这项任务的时间
HH:MM [YYYY-mm-dd]
noon, midnight, teatime(4pm),tomorrow
now+#{minutes,hours,days, OR weeks}
#at 时间格式
HH:MM 在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务
02:00

HH:MM YYYY-MM-DD   规定在某年某月的某一天的特殊时刻进行该项任务
02:00 2016-09-20

HH:MM[am|pm] [Month] [Date]
06pm March 17
17:20 tomorrow

HH:MM[am|pm] + number [minutes|hours|days|weeks], 在某个时间点再加几个时间后才进行该项任务
now + 5 min
02pm + 3 days
  • at 任务执行方式:
    • 交互式
    • 输入重定向
    • at -f file
  • /etc/at.{allow,deny} 控制用户是否能执行at任务
    • 白名单:/etc/at.allow 默认不存在,只有该文件中的用户才能执行at命令;
    • 如果两个文件都不存在,只有 root 可以执行 at 命令;
    • 黑名单:/etc/at.deny 默认存在,拒绝该文件中用户执行at命令,而没有在at.deny 文件中的使用者则可执行;

2、周期性任务计划 cron

周期性任务计划cron相关的程序包

  • cronie:主程序包,提供crond守护进程及相关辅助工具
  • crontabs:包含CentOS提供系统维护任务
  • cronie-anacron:cronie的补充程序,用于监控cronie任务执行状况,如:cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务
#cron 依赖于crond服务,确保crond守护处于运行状态
#CentOS 7 以后版本:
systemctl status crond
#CentOS 6:
service crond status

cron任务

  • 系统cron任务:系统维护作业,/etc/crontab 主配置文件, /etc/cron.d/ 子配置文件
  • 用户cron任务:红帽系统保存在 /var/spool/cron/USERNAME,Ubuntu 系统存放在/var/spool/cron/crontabs/USERNAME,利用 crontab 命令管理

计划任务日志:/var/log/cron

2.1、系统cron计划任务

#/etc/crontab 格式说明
[root@web01 ~]# cat /etc/crontab
SHELL=/bin/bash                       #默认的SHELL类型
PATH=/sbin:/bin:/usr/sbin:/usr/bin    #默认的PATH变量值,可修改为其它路径
MAILTO=root                         #默认标准输出和错误发邮件给root,可以指向其它用户

# 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
#计划任务时间表示法
(1) 特定值
 给定时间点有效取值范围内的值

(2) *
 给定时间点上有效取值范围内的所有值,表示“每...”,放在星期的位置表示不确定

(3) 离散取值
 #,#,#

(4) 连续取值
 #-#

(5) 在指定时间范围上,定义步长
 /#: #即为步长

(6) 特定关健字
@yearly 0 0 1 1 *
@annually 0 0 1 1 *
@monthly 0 0 1 * *
@weekly 0 0 * * 0
@daily 0 0 * * *
@hourly 0 * * * *
@reboot Run once after reboot
#范例
#晚上9点10分运行echo命令,输出信息仍会发送到root 邮箱
10 21 * * * test /bin/echo "test!"

#每3小时echo和wall命令
0 */3 * * * test /bin/echo “test”;  wall “welcome to hello!”
#crond任务相关文件
/etc/crontab       配置文件
/etc/cron.d/       配置文件
/etc/cron.hourly/  脚本
/etc/cron.daily/   脚本
/etc/cron.weekly/  脚本
/etc/cron.monthly/ 脚本

2.2、用户计划任务

crontab命令

  • 每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME;
  • 默认标准输出和错误会被发邮件给对应的用户,如:wang创建的任务就发送至wang的邮箱;
  • root能够修改其它用户的作业;
  • 用户的cron 中默认 PATH=/usr/bin:/bin,如果使用其它路径,在任务文件的第一行加PATH=/path或者加入到计划任务执行的脚本中;
  • 第六个字段指定要运行的命令。 该行的整个命令部分,直至换行符或“%”字符,指定的shell执行.除非使用反斜杠(\)进行转义,否则该命令中的“%”字符将变为换行符,并且第一个%之后的所有数据将作为标准输入发送到该命令。
crontab [-u user] [-l | -r | -e] [-i]

-l      列出所有任务
-e      编辑任务
-r      移除所有任务
-i      同-r一同使用,以交互式模式移除指定任务
-u user 指定用户管理cron任务,仅root可运行

#控制用户执行计划任务:
/etc/cron.{allow,deny}

#范例
#在6,8,10,12点整共4次分别执行test.sh
crontab -l
0 6-12/2 * 11 * /app/bin/test.sh

#以下配置只会在5,7,9,11点整执行
crontab -l
0 5-12/2 * 11 * /app/bin/test.sh

cron任务中不建议使用%,它有特殊用途,它表示换行的特殊意义,且第一个%后的所有字符串会被将
成当作命令的标准输入,如果在命令中要使用%,则需要用 \ 转义。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享