Linux - 任务管理

文章目录

  • 任务管理概述
  • 任务管理的类型
  • 计划执行 at
      • at 命令
      • 设置时间 - 绝对计时
      • 设置时间 - 相对计时
      • 执行权限
  • 周期性运行程序 - cron
      • cron 运行机制
      • crontab 命令
      • crontab 文件
      • 编辑配置文件

任务管理概述

在系统运维过程中,可能需要在某个预设的时间执行特定任务。比如定时发送邮件、备份并清空日志文件等任务。

任务的内容可以看作是一系列命令或者一个脚本,我们则需要在特定时间去执行它。Linux - 任务管理_第1张图片

任务管理的类型

  • 计划执行,在特定时间运行一次:at
  • 定期执行,按周期执行多次:cron

计划执行 at

如果系统未安装 at,则先安装并启动:

yum install -y at
systemctl start at
  • at 命令可以指定 Linux 在特定时刻运行脚本
  • atd 是 at 的守护进程,在系统启动时就会以后台模式运行
  • atd 进程会定期检查系统上的 /var/spool/at 目录,获取通过 at 命令写入的任务
    Linux - 任务管理_第2张图片

at 命令

用户使用 at 命令在指定时刻执行指定的命令序列,该命令至少需要指定一个命令和一个执行时间,可以只指定时间,也可以时间和日期一起指定

at 命令语法:
	at [-V] [-q 队列] [-f 文件名] [-mldbv] 时间 
	at -c 作业[作业...]

设置时间 - 绝对计时

at 允许使用一套相当复杂的时间指定方法:

  • 接受在当天的 hh:mm(小时:分钟)式的时间指定;如果该时间已经过去,那么就放存第二天执行
  • 使用 midnight(深夜)、noon(中午)、teatime(饮茶时间,一般是下午4点)等比较模糊的词语来指定时间
  • 采用 12 小时计时制,即在时间后面加上 AM 或者 PM 来说明是上午还是下午
  • 指定命令执行的具体日期,指定格式为month day(月日)或者 mm/dd/yy(月/日/年)或者dd.mm.yy(日.月.年);指定的日期必须跟在指定时间的后面

设置时间 - 相对计时

使用相对计时法,对于安排不久后就要执行的命令较为方便:

  • 指定格式为 now+count time-units,now就是当前时间,time-units 是时间单位,这里可以是minutes(分钟)、hours(小时)、days(天)、weeks(星期)
  • count 是时间的数量,究竟是几天,还是几小时等;还有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间
  • 例如指定在今天 16:30 执行某个命令;假设现在时间是 12:30,2015年6月7日,命令如下:
at 4:30pm 
at 16:30 
at 16:30 today 
at now+4 hours 
at now+240 minutes 
at 16:30 7.6.15 
at 16:30 6/7/15 
at 16:30 Jun 7

以上 8 条命令的执行效果完全相同。

配置步骤:

  1. at + 时间, 输入完成后,进入交互式界面,按 Ctrl + d 结束命令的输入
  2. at -f file-name.sh 时间 ,可执行特定脚本文件
  3. 使用 atq 命令查看作业队列
  4. 使用atrm 命令可以删除作业队列中的作业,格式为 atrm + 作业号,作业号 为 atq 回显的第一列

执行权限

对于 at 命令来说,需要定时执行的命令是从标准输入或者使用 –f 选项指定的文件中读取并执行的。如果 at 命令是从一个使用 su 命令切换到用户 shell 中执行的,那么当前用户被认为是执行用户,所有的错误和输出结果都会送给这个用户;对于其他用户来说,是否执行某个命令或脚本取决于 /etc/at.allow 和 /etc/at.deny 文件
Linux - 任务管理_第3张图片

周期性运行程序 - cron

at 命令会在指定时间内完成指定任务,但是只能执一次;系统在指定时间完成任务,以后就不再执行了。而在很多情况下需要周期性重复执行一些命令,这时候需要使用 cron 命令来完成任务。

cron 运行机制

  • cron 会搜索 /var/spool/cron 目录,寻找以 /etc/passwd 文件中的用户名命名的 crontab 文件,然后将 crontab 文件装入内存。比如一个用户名为globus的用户,对应的crontab立件应该是/var/spool/cron/globus,即以该用户命名的crontab文件存放在/var/spool/cron目录下面。
  • cron 还将搜索 /etc/crontab 文件,这个文件(cron 时间表)是以特定格式写成的
  • cron 启动以后,先检查是否有用户设置了crontab文件,如果没有就转入睡眠状态,释放系统资源;所以该后台进程占用资源极少,之后每分钟被换醒一次,查看当前是否有需要运行的命令
  • 命令执行结束后,任何输出都将作为邮件发送给crontab的所有者,或者是/etc/crontab文件中MAILTO环境变量中指定的用户。这是cron的工作原理,但是cron命令的执行不需要用户干涉,用户只需要修改crontab中要执行的命令。

crontab 命令

crontab 命令用于安装、删除或者显示用于驱动 cron 后台进程的表格。用户把需要执行的命令序列放到 crontab 文件中以获得执行,而且每个用户都可以有自己的 crontab 文件。

crontab 常用命令:
	crontab -u   //设置某个用户的cron服务,root用户在执行crontab时需要此参数
	crontab -l   //列出某个用户cron服务的详细内容
	crontab -r   //删除某个用户的cron服务
	crontab -e   //编辑某个用户的cron服务

crontab 文件

在 crontab 文件中输入需要执行的命令和时间,该文件中每行都包括6个域,其中前5个域是指定命令被执行的时间,最后一个域是要被执行的命令。

每个域之间使用空格或者制表符分隔,格式如下:

minute hour day-of-month month-of-year day-of-week commands

Linux - 任务管理_第4张图片
例:每周一上午 8:00 执行命令

00 08 * * 1 commands

crontab 文件参数补充

  • 上述参数项都不能为空,必须指定值
  • 对于要执行的命令,调用的时候需要写出命令的绝对路径
  • 除了数字还有几个特殊的符号“*”、“/”和“-”、“,”Linux - 任务管理_第5张图片

例:晚上11点到早上8点之间每两个小时,在/tmp/test.txt文件中加入sleepy文本,在 crontab 文件中对应的行如下:

* 23-8/2 * * * echo"sleepy" >> /tmp/test.txt

注意:每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件。此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e来编辑。用户也可以另外建立一个文件,使用“cron文件名”命令导入cron设置。cron启动后,每过一分钟读一次crontab文件,检查是否要执行里面的命令。因此该文件被修改后不需要重新启动cron服务。

编辑配置文件

cron 服务每分钟不仅要读一次 /var/spool/cron 内的所有文件,还需要读一次/etc/crontab。使用 crontab 配置是针对某个用户的,而编辑 /etc/crontab 是针对系统的任务。

此文件的文件格式如下:

SHELL=/bin/sh
PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin
MAILTO=root             //如果出现错误,或者有数据输出,数据作为邮件发给这个账号
HOME=/
# run-parts01 
* * * * root run-parts /etc/cron.hourly  //每个小时执行一次/etc/cron.hourly里的脚本
02 4 * * * root run-parts /etc/cron.daily                    //每天执行一次/etc/cron.daily里的脚本
22 4 * * 0 root run-parts /etc/cron.weekly                //每周执行一次/etc/cron.weekly里的脚本
42 4 1 * * root run-parts /etc/cron.monthly              //每月执行一次/etc/cron.monthly里的脚本

注意:如果去掉run-parts参数,其后面就是运行的某个脚本名,而不是目录名。

你可能感兴趣的:(Linux,linux,运维,计划执行at,周期运行cron)