一次性任务计划

工具默认未安装
语法:at data_time

yum -y install atd
光安装不行还得启动服务
systemctl start atd #启动服务
systemctl enable atd #开机自启
systemctl status atd #查看服务状态

时间日期写法:

绝对时间
  HH:MM:具体时间点
  DD.MM.YYYY:天.月.年
  YYYY-MM-DD:年-月-日
  MM/DD/YY:月/日/年
  HH:MM YYYY-MM-DD:时:分 年-月-日
相对时间
  at now+3minutes(min也行):从任务计划创建开始计时,3分钟以后执行

选项:

-l #显示at任务列表,等同于atq。
-d #删除指定编号at任务,等同于atrm。
-c #显示指定编号at任务执行的命令。
-f #读取指定文件中任务,避免在命令行交互。

例子

[root@gbb ~]# at time
at> command #写下你要操作的命令(有多条写完直接回车继续写),ctrl+d保存退出。

如果你发现,输错要执行的命令怎么都删不掉,可以试试Ctrl+Backspace

设置at任务后在/var/spool/at/ 目录下目录生成一个脚本文件,用选项查看就是这里脚本文件。

计划执行结果会以mail发送给执行at的用户(软件包名是:mailx),直接输入mail命令查看邮件列表,之后可以输入mail_id查看指定邮件查看完成后用q退出。如果你发现没有邮件,那可能是mail服务出现了问题,可以查看一下本地环回地址25号端口有没监听。

at命令不是谁都可以执行的,在/etc目录中有at.allow与at.deny两文件(允许与拒绝),at.allow是除了文件中的用户外谁也不能用,at.deny存在表示文件内的用户名被拉黑(使用方法是在文件中写上用户名重启服务就能生效),如果目录下两个文件不存在就只能root执行at命令。

batch:CPU空闲执行计划,负载<0.8才执行batch中的任务,uptime查看CPU平均负载。直接输入batch后面就是你要执行的命令,貌似不能指定时间,at够用....需要再折腾。

周期性任务计划

系统周期性任务:每隔一段时间自动执行,比如日志轮换(logrotate)、登录文件分析(logwatch)、locate数据库更新(updatedb)、man数据库更新(mandb/makewathis)、rpm软件登录文件创建、网络相关分析行为,自动清空tmp目录。

用户周期性任务:自己每隔多长时间自动去执行某些操作。

要想任务能够成功执行需要启动服务。

systemctl start crond #启动服务
systemctl enable crond #开机自启
systemctl status crond #查看服务状态

语法:crontab options
选项:

-e #增加或编辑一个cron任务内容
-u #为指定用户设置cron任务计划(root才能使用)
-l #查看cron任务列表
-r #清空整个cron列表。如果想删除某一条,-e进入去删或者注释。
-i #在清空任务时,提示是否要清清空。

例子:
它和crontab一样,不过设置日期的格式不同。这是说,每月1号零点去压缩upload目录内容,它格式有两种方式,如下。

  • 用户设置:分 时 日 月 周 用户 命令 #指定某个用户与运行
  • 系统设置:分 时 日 月 周 命令 #默认root用户
[root@gbb ~]# crontab -e #会自动打开一个临时文件,和编辑文本一样去操作。
00 0 1 * * zip -r /root/upload.zip /usr/local/nginx/upload
#写命令时有%,需要对它转义,也可放入单引号中。

别直接编辑这个配置文件,因为它不会告诉你语法错误,别骚,除非你是神仙。另外crontab不像at给计划加上了执行命令加上了环境(at -c中前半部分),可能部分命令在未登录情况下不能执行,建议给命令加上绝对路径(参见下文crontab配置文件中PATH)。

具体的日期范围:

时间单位范围值
minute0 - 59
hour0 - 23
day of month1 - 31
month1 - 12
day of week0 - 6(Sunday=0 or 7)
#用法:
通配:*任意时间
  10 17 * * * cat /etc/fstab #每天下午五点十分去执行命令
  10 * * * * cat /etc/fstab #每小时的第十分去执行命令,01:10,02:10,每个小时去执行。
  * * * * * cat /etc/fstab #每分钟去执行
  10 17 * * 0 cat /etc/fstab #每周日下午五点十分执行。
  10 17 11 * * cat /etc/fstab #每月7号下午五点十分执行。
  10 17 20 3 * cat /etc/fstab #每年3月20号下午五点十分执行。

离散时间段:,(逗号)
  5,15,30,45,56 17 * * * cat /etc/fstab #每天五点5,15,30,45,56来执行命令
  0 15,20 * * 3,0 #每周三周日下午三点和八点整执行。
    * 15,20 * * 3,0 #分钟位置*代表每分钟执行。

连续时间段:-(中横线)
  00 23 * * 1-5 cat /etc/fstab #每周一到周五晚上十一点执行命令。
  0 9-18 * * 1-5 cat /etc/fstab #每周一到周五9-18每小时执行。
  
间隔时间段:*/n(n是步长) 
  */5 * * * * cat /etc/fstab #每五分钟执行
  00 10 */5 * * cat /etc/fstab #每隔五天的十点整执行
  */7 * * * * cat /etc/fstab #每7分钟执行?当步长不能被整除,这个计划就不会执行。
  
指定日期时day of week和day of month最好不要一起用,因为无法保证那一天一定是周几。

配置文件

文件解释
/var/spool/cron用户cron任务计划配置文件
/etc/crontabcron配置文件
/etc/cron.allow允许哪些用户使用此命令
/etc/cron.deny拒绝哪些用户使用此命令(默认存在)
/etc/cron.dcron辅助配置文件目录

Linux用户设置完cron任务后,会在/var/spool/cron目录下生成和用户同名的cron文件。执行成功后会发一封mail到用户中,要是执行任务比较频繁每次发送邮件会充满屏幕,这时可以把成功结果重定向到/dev/null,做法是在要执行命令后面加上command > dev/null

/etc/crontab

SHELL=/bin/bash #用什么shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin #corntab执行命令去哪个目录中找
MAILTO=root #收取邮件的用户

# For details see man 4 crontabs  #查看更多细节用 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 是你要执行的命令。

/etc/cron.d

目录内0hourly文件内容是每小时执行的任务

/etc/cron.hourly:cron工具去执行
/etc/cron.daily,/etc/cron.weekly,cron.monthly是anacron工具去执行

anacron

当cron任务异常未执行,anacron会重新去执行cron任务。

语法:anacron [options] [job]
选项:

-s #依据时间记录文件去判断是否执行
-f #强制执行
-n #立刻运行未执行的任务,不需要延时

配置文件:

/var/spool/cron
对/etc/anacrontab文件解释
# /etc/anacrontab: configuration file for anacron

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

SHELL=/bin/sh #使用的shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin  #命令的位置
MAILTO=root #执行成功mail发给谁
# 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 days   delay in minutes   job-identifier   command
1    5    cron.daily        nice run-parts /etc/cron.daily
7    25    cron.weekly        nice run-parts /etc/cron.weekly
@monthly 45    cron.monthly        nice run-parts /etc/cron.monthly


对配置文件其中一句的解释:
这一段的意思是一天内没执行,5分钟后立马执行后面的命令。1是日期,5是延迟几分钟去执行(要加上anacrontab配置文件中随机延迟范围的3—22小时),cron.daily标明了你是什么类型的任务,这一句是以天为单位的任务,nice run-parts /etc/cron.daily是你要执行的命令,提高优先级去执行cron.daily下的脚本。

1    5    cron.daily        nice run-parts /etc/cron.daily
anacron执行流程(还没弄懂):
     1:由/etc/anacrontab分析到cron.daily天数为1天
     2:由/var/spool/anacron/cron.daily取出最近一次执行anacron时间戳
     3:由2步骤分析出的时间戳和cron任务进行比较,查看哪些cron任务超过1天时间没有执行
     4:根据/etc/anacrontab设置,延迟执行。
     5:延时时间到执行

标签: Linux

添加新评论