任务计划

沉舟侧畔千帆进,病树前头万木春。这篇文章主要讲述任务计划相关的知识,希望能为你提供帮助。
at 指定时间点,执行一次性任务
【任务计划】batch 系统自行选择空闲时间去执行此处指定的任务
周期性运行某任务:cron

1.at

包:at
at [option] TIME
-V#显示版本信息
-t time#时间格式[[CC]YY]MMDDhhmm[.ss]
-llist=atq#列出指定队列中等待运行的作业
-ddelete =atrm #删除指定的作业
-c#查看具体作业任务
-f /path/file#指定文件读取任务
-m#任务完成后,将给用户发送邮件,即使没有标准输出
-q#指定新任务的队列名称

注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户

1.1.时间格式
TIME:定义出什么时候进行 at 这项任务的时间
YYMMDDhhmm[.ss]#缩写年,月,日,小时,分钟[秒]
CCYYMMDDhhmm[.ss] #完整年,月,日,小时,分钟[秒]

HH:MM[YYYY-mm-dd]
02:00
02:00 2016-09-20

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

noon ,midnight,teatime[4pm]

tomorrow
17:20 tomorrow

now+#minutes,hours,days, weeks,months,years
HH:MM[am|pm]+#minutes,hours,days, weeks,months,years
now+5min
02pm+3days

1.2.at任务
#执行方式
1)交互式 2)输入重定向 3)at –f 文件

依赖atd服务,需要启动才能实现at任务

at队列存放:/var/spool/at目录

/etc/at.allow #默认不存在,只有该文件中的用户才能执行at命令
/etc/at.deny#默认存在,拒绝该文件中用户执行at命令,
如果两个文件都不存在,只有root可以执行at命令

2.周期性任务计划cron2.1.相关程序包

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

2.2.确保crond守护处于运行状态
#CentOS 7:
systemctl status crond
#CentOS 6:
service crond status

2.3.计划周期性执行的任务提交给crond,到指定时间会自动运行
#系统cron任务:系统维护作业
/etc/crontab
#用户cron任务:
crontab命令

2.4.日志
/var/log/cron

2.5.包安装
[root@CentOS7-1810 ~]# rpm -qi cronie
[root@CentOS7-1810 ~]# systemctl status crond
[root@CentOS7-1810 ~]# rpm -ql cronie
/usr/sbin/crond#主程序
/usr/lib/systemd/system/crond.service
/usr/bin/crontab #创建用户自定义的计划任务
/var/spool/cron#计划任务存放位置

#创建任务工具包
[root@CentOS7-1810 ~]# rpm -qi crontabs
[root@CentOS7-1810 ~]# rpm -ql crontabs
/etc/cron.daily#文件夹 ,可以写一些配置文件
/etc/cron.hourly#文件夹
/etc/cron.monthly #文件夹
/etc/cron.weekly#文件夹
/etc/crontab# 文件
/etc/sysconfig/run-parts
/usr/bin/run-parts#运行目录中的一些程序
/usr/share/man/man4/crontabs.4.gz
/usr/share/man/man4/run-parts.4.gz

[root@CentOS7-1810 ~]# ls /var/spool/
abrtabrt-uploadanacronatcroncupslpdmailplymouthpostfix

[root@CentOS7-1810 ~]# rpm -qi cronie-anacron#补充性的工具包

2.6.系统计划任务
[root@CentOS7-1810 ~]# cat/etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=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-namecommand to be executed
1,10,30#每小时1分钟,10分钟,30分钟
*/10#每10分钟
*#每分钟或者 */1
10-20#10分钟到20分钟

*/1 * * * 1-5tao /data/checkdisk.sh

分,时与周时并且的关系

2.7.时间表示方法
1.特定值
时间点取值范围内的某个值
2.*
时间点取值范围内所有值,表示"每.."
3.离散取值
#,#,#
4.连续取值
#-#
5.指定时间范围,定义步长
/##即为步长

0 * * * *hourly
0 0 * * *daily
0 0 * * 0weekly
0 0 1 * *monthly
0 0 1 1 *annually
0 0 1 1 *yearly

示例:每3小时echo和wall命令
0 */3 * * * centos /bin/echo "wdy"; wall "welcome to Wrold!"

man 5 crontab
/Note
---------------------------------------------------------------------------------------------
Note:Theday of a commands execution can be specified in the following two fields — day of month, and day of week.
If both fields are restricted (i.e., do not contain the "*" character), the command will be run when either fieldmatches
the current time.For example,
"30 4 1,15 * 5" would cause a command to be run at 4:30 am on the 1st and 15th of each month, plus every Friday.
-----

2.8.检查磁盘利用率报警

[root@CentOS7-1810 ~]# df | sed -rn /^\\/dev\\/sd/s#.* ([0-9]+)%.*$#\\1#p|sort -nr |head -1
[root@CentOS7-1810 data]# catcheckdisk.sh
USE=`df | sed -rn /^\\/dev\\/sd/s#.* ([0-9]+)%.*$#\\1#p|sort -nr |head -1`
[ "$USE" -gt 15 ] & & wall disk will be full
[root@CentOS7-1810 data]# chmod +x checkdisk.sh

#crontab当前用户创建计划任务
crontab -e#实际是vim打开文件
* * * * * /data/checkdisk.sh#每分钟做检查
* * * * * /bin/touch /data/wangfile1.log#最好写上路径,避免找不到程序

2.9.crontab
每个用户都有专用的cron任务文件/var/spool/cron/USERNAME
crontab [-u user][-l | -r | -e][-i]
-llist
-eedit
-rremove
-i同-r#以交互模式移出指定任务
-u user#仅root可运行,指定用户管理cron任务

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

对于cron任务来讲,%有特殊用途;如果在命令中要使用%,则需要转义,将%放置于
单引号中,则可不用转义

#看自己计划任务
crontab -l
#看别人的计划任务
crontab -l -u wang
#删除计划任务
crontab -r -u wang#实际是删除cron目录下的文件


#多个任务在某个时刻同时运行
mkdir /data/scripts
echo wall 1 > /data/scripts/f1.sh
echo wall 2 > /data/scripts/f2.sh
echo wall 3 > /data/scripts/f3.sh
chmod +x /data/scripts/*

执行顺序跟ls显示顺序一致
* * * * * /usr/bin/run-parts /data/scripts/

2.10.实现秒级运行任务/每7分钟运行任务
*/10 * * * * /usr/sbin/ntpdate 172.16.0.2 & > /dev/null#每10分钟同步时间
每7分钟,用/7是不可以的,可以通过休眠420秒

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


方法1:
写一个后台运行的脚本一直循环,然后每次循环sleep一段时间
while true ; do
command
sleep XX //间隔秒数
done


#方法2:
以下方法将每20秒执行一次
crontab -e
* * * * * /bin/date
* * * * * sleep 20; /bin/date
* * * * * sleep 40; /bin/date
这种做法去处理隔几十秒的定时任务还好,要是每1秒运行一次就得添加60条记录

* * * * * for min in 0 1 2; do echo "hi"; sleep 20; done

2.11.anacron系统
运行计算机关机时cron不运行的任务,CentOS6以后版本取消anacron服务,由crond服务管理
对笔记本电脑、台式机、工作站、偶尔要关机的服务器及其它不一直开机的系统很重要对很有用
配置文件:/etc/anacrontab,负责执行/etc/ cron.daily /etc/cron.weekly /etc/cron.monthly中系统任务
?字段1:如果在这些日子里没有运行这些任务……
?字段2:在重新引导后等待这么多分钟后运行它
?字段3:任务识别器,在日志文件中标识
?字段4:要执行的任务
由/etc/cron.hourly/0anacron执行
当执行任务时,更新/var/spool/anacron/cron.daily 文件的时间戳

[root@openstick1 ~]# cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in daysdelay in minutesjob-identifiercommand
1 5 cron.dailynice run-parts /etc/cron.daily
7 25cron.weeklynice run-parts /etc/cron.weekly
@monthly 45 cron.monthlynice run-parts /etc/cron.monthly


    推荐阅读