Linux计划任务管理

Linux计划任务管理

Linux系统下的计划任务大致分为两类:

一、单次计划任务

单次计划任务按执行方式不同又分为以下2种:

1、at:指定时间点,执行一次性任务,用法如下

at 命令:at [option] TIME

常用选项:
-V 显示版本信息
-t time 时间格式 [[CC]YY]MMDDhhmm[.ss]
-l 列出指定队列中等待运行的作业;相当于atq
-d 删除指定的作业;相当于atrm
-c 查看具体作业任务,后面跟任务队列中的任务编号ID
-f /path/file 指定的文件中读取任务
-m 当任务被完成之后,将给用户发送邮件,即使没有标准输出

TIME:定义具体执行at这项任务的时间点,TIME格式如下:
HH:MM [YYYY-mm-dd]
noon, midnight, teatime(4pm)
tomorrow
now+#{minutes,hours,days, OR weeks}

TIME时间格式举例如下:
HH:MM 02:00
在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务
HH:MM YYYY-MM-DD 02:00 2016-09-20

规定在某年某月的某一天的特殊时刻进行该项任务
HH:MM[am|pm] [Month] [Date]
04pm March 17
17:20 tomorrow

在某个时间点再加几个时间后才进行该项任务
HH:MM[am|pm] + number [minutes|hours|days|weeks]
now + 5 min
02pm + 3 days

at任务的创建方式有如下几种:

1)交互式        #输入at命令与系统交互式创建
2)输入重定向    #采用管道符"|" 或者"<" 输入重定向创建 
3)at -f 文件   #使用-f选项后面跟指定的文件的方式来创建

举例:创建定时任务,今天18:00自动关机

[root@centos7 ~]#at 18:00 
at> shutdown -p
at> <EOT>             #按Ctrl+D键正常结束输入
job 4 at Thu Aug 22 18:00:00 2019

查看创建的at任务列表
[root@centos7 ~]#at -l      #或者使用atq命令
4	Thu Aug 22 18:00:00 2019 a root
[root@centos7 ~]#

查看指定任务的具体信息
[root@centos7 ~]#at -c 4    #4为指定任务的编号ID


删除at任务
[root@centos7 ~]#at -d 4
或者
[root@centos7 ~]#atrm 4

2、batch:系统自行选择空闲时间去执行此处指定的任务 (此类计划任务由于执行时间不确定,所以使用相对较少)

举例:创建任务,在系统空闲的时候,自动将/data目录下的f1.log压缩

[root@centos7 ~]#batch 
at> gzip /data/f1.log
at> <EOT>    #Ctrl+D 正常退出完成任务输入

用户创建at任务的权限管理控制

./etc/at.{allow,deny}控制用户是否能执行at任务

白名单:/etc/at.allow 默认不存在,只有该文件中的用户才能执行at命令

黑名单:/etc/at.deny 默认存在,拒绝该文件中用户执行at命令,而没有在at.deny 文件中的使用者则可执行

如果两个文件都不存在,则只有 root 可以执行 at 命令

at与batch命令创建的计划任务默认存放在 /var/spool/at 目录下

注意:at与batch命令依赖atd服务,需确保系统atd服务处于运行状态

查看atd服务是否启动

centos7系统:
[root@centos7 ~]#systemctl status atd.service 

centos6系统:
[root@centos6 ~]#/etc/init.d/atd status

二、周期性计划任务cron

cron任务依赖系统crond服务,使用cron任务需要确保系统crond服务处于启动运行状态。

查看crond服务运行状态:

centos7系统:
[root@centos7 ~]#systemctl status crond.service 

centos6系统
[root@centos6 ~]#/etc/init.d/crond status

cron任务的具体使用方法

1、创建系统计划任务

修改以下相关配置文件,或将需要添加计划任务的脚本放入到以下对应的目录中
/etc/crontab 配置文件
/etc/cron.d/ 配置文件
/etc/cron.hourly/ 脚本
/etc/cron.daily/ 脚本
/etc/cron.weekly/ 脚本
/etc/cron.monthly/ 脚本

2、通过corntab命令创建用户自定义的计划任务

crontab命令相关用法如下:

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

控制用户执行计划任务权限(通过设置黑白名单):
/etc/cron.{allow,deny}

cron任务创建后,任务队列存放在每个用户专用的cron任务目录下 /var/spool/cron/USERNAME

cron任务的日志文件位于 /var/log/cron

cron的配置有5个时间(5个*号),分别表示分钟、小时、天、月、周,具体说明如下:

 ┌───────────── 分钟(0 - 59)
 │ ┌───────────── 小时(0 - 23)
 │ │ ┌───────────── 天 (1 - 31)
 │ │ │ ┌───────────── 月 (1 - 12)
 │ │ │ │ ┌───────────── 周几 (0 - 6) (周日到周六,其中周日可以用0或7表示)
 │ │ │ │ │                                    
 │ │ │ │ │
 │ │ │ │ │
 * * * * *  

* 星号   表示任意值
,逗号    表示多个值,例如  1,2,3 
- 连字符    表示连续的范围,例如3-6,代表3,4,5,6
/ 斜线   表示在指定的时间范围上,定义步长,注意,定义的步长的值,对应字段的值需要能整除,例如在分钟字段,*/5,表示每5分钟,对应的执行任务的时刻点为0 5 10 15 20 25 30 35 40 45 50 55,如不能整除则无效,例如分钟字段不能设置为7(因为60不能被7整除)
L    表示最后(last),比如在周那个字段的6L表示某一个月的最后一个周六。

另外还有W # ? H 不常用,此处就不作详细解释了。

常用的cron表达式举例:

每小时

0 * * * *

每2小时

* */2 * * *

每个月的10号和每个礼拜的礼拜一到礼拜三的早上11点

0 11 10 * 1-3

每天的下午2点从1分到40分的每分钟

1-40 14 * * *

每天的早上8点到下午4点,每隔两个小时

0 8-16/2 * * *

每年3月到6月份,每个月的1号、10号、20号,或者每个月的星期天

* * 1,10,20 3-6 0

cron任务注意事项:

1、在同时存在日期字段和星期字段的表达式中,日期和星期在条件匹配上是或者的关系,只要满足其中一个条件,计划任务就会执行,其他字段为并且的关系,需要同时满足才执行。

2、运行结果的标准输出和错误默认会以邮件通知给相关用户,如不希望产生大量邮件,需要将命令的输出做重定向处理,例如:

COMMAND &> /dev/null

3、对于cron任务来讲,%有特殊用途;如果在命令中要使用%,则需要转义,将%放置于单引号中,则可不用转义,或者将命令写入脚本文件中。

原文地址:https://www.cnblogs.com/eddie1127/p/11394678.html