RH134(8.0)-计划将来的任务(第二章)

11 篇文章 1 订阅

本章目标:

  • 设置一个在将来某个时刻运行一次的命令
  • 利用用户的crontab文件,安排命令按计划重复运行
  • 利用系统crontab文件和目录,安排命令按计划重复运行
  • 启用和禁用systemd定时器并配置管理临时文件的定时器

一、计划延迟的用户作业

1. 描述延迟的用户任务

   有时,我们可能需要在将来某个设定的点运行一个命令或一组命令。例如,员工计划要向老板发送电子邮件,或正在处理防火墙配置的系统管理员要落实在十分钟重置防火墙设置的“安全”作业(除非提前停用该作业)。
  这些计划好的命令通常被称为任务或作业,而延迟一词则表示这些任务或作业将在未来运行。
  针对RHEL用户安排延迟任务,可用的解决方案之一为at。at软件包中提供了(atd)系统守护进程,以及一组与守护进程交互的命令行工具(atatq等等)。在默认的RHEL安装过程中,将自动安装并启用atd守护进程。
  用户(包括root)可以使用at命令为atd守护进程的作业排队。atd守护进程提供了az共26个队列,作业按字母顺序排列,队列越后,系统优先级越低。

1.1 计划延迟的用户任务

  使用at TIMESPEC命令可以计划新的作业。然后at命令从stdin通道中读取要执行的命令。手动输入命令时,我们可以按Ctrl+D来完成输入。对于易出现打印错误的复杂命令,通常借助脚本文件使用输入重定向会更为方便(例如:at now +5min < myscript),而非在终端窗口中手动输入所有命令。
  TIMESPEC参数与at命令可以接受许多强大组合,从而允许用户准确描述作业运行的时间。通常,这些组合以时间(例如02:00pm15:59甚至teatime)开头,后面接一个可选日期或将来的天数。下文列出了一些可以使用的组合示例:
now +5min
teatime tomorrow(下午茶时间为16:00)
noon +4 days
5pm august 3 2021
如需有效时间规范的完整列表,可以阅读参考资料中所列的timespec定义。

2. 检查和管理延迟的用户作业

  要获得当前用户的待处理作业的概述,则使用atqat -l命令

[user@host ~]$ atq
①28  ②Mon Feb  2 05:13:00 2015 ③a ④user
29  Mon Feb  3 16:00:00 2014 h user
27  Tue Feb  4 12:00:00 2014 a user

① 该作业的唯一作业编号
② 计划作业的执行日期和时间
③ 表示作业已排入默认队列a,不同的作业可以排入不同的队列中
④ 作业所有者(以及将运行作业的用户身份)
要检查在执行作业时将运行的实际命令,则使用at -c JOBNUMBER命令。该命令会显示所设置作业的环境,以使在用户创建作业时反映用户的环境,后跟将运行的实际命令

2.1. 删除作业

  atrm JOBNUMBER命令将会删除计划的作业。当不再需要计划的作业时(例如,远程防火墙配置成功且不需要重置时),可将其删除。

二、计划周期性用户作业

1. 描述周期性用户作业

  按计划重复运行的作业被称为周期性作业。RHEL系统附带了特别针对周期性作业的crond守护进程,由cronle软件包提供,且默认启用并启动。crond守护进程会读取多个配置文件(每个用户对应一个配置文件,使用crontab命令进行编辑)以及一组系统范围内的文件。这些配置文件使用户和管理员拥有细微的控制权,可以控制应执行周期性作业的时间。
  如果计划的命令生成了任何未被重定向的输出或错误,则crond守护进程将尝试使用系统中配置的邮件服务器将该输出或错误通过电子邮件发送给拥有该作业的用户(除非被覆盖)。根据环境,这可能需要进行其他配置。可以将计划命令的输出或错误重定向到其他文件。

2. 计划周期性用户作业

  普通用户可以使用crontab命令来管理作业。可以通过四种方式调用该命令:
crontab示例

命令预期用途
crontab -l列出当前用户的计划作业
crontab -r删除当前用户的所有作业
crontab -e编辑当前用户的作业
crontab filename删除所有作业,并替换为从filename读取的作业。如果 没有指定文件,则使用stdin

3. 描述用户作业格式

  除非EDITOR环境变量采用了不同的设置,否则crontab -e命令默认会调用vim。每行只输入一个作业。其他有效条目包括:空行,通常为了便于阅读;注释,由以数字符号(#)开头的行标识;采用格式NAME=value的环境变量,这会影响相应声明行下面的所有行。常见变量设置包括SHELL变量和MAILTO变量,前者声明用于解释crontab文件其余行的shell,后者确定由谁来接收通过电子邮件发送的输出。
crontab文件中的字段按以下顺序显示:
 - 分钟
 - 小时
 - 日
 - 月
 - 星期
 - 命令
前五个字段全部使用相同的语法规则:
 - * 表示“无关紧要”/始终
 - 数字可用于指定分钟数或小时数、日期或者工作日。对于工作日,0表示星期日,1表示星期一,2表示星期二,依此类推。7也表示星期日
 - x-y 表示范围,x到y(含)
 - x,y表示列表。列表也可以包含范围,例如,Minutes列中的5,10-13,17表示作业应当在每小时过去5分钟、10分钟、11分钟、12分钟、13分钟和17分钟后运行
 - */x表示x的时间间隔,例如Minutes列中的***/7**表示每七分钟运行一次作业
此外,可以使用三个字母的英文缩写来表示月份和工作日,例如,Jan、Feb以及Mon、Tue
最后一个字段包含使用默认shell执行的命令。SHELL环境变量可用于更改计划命令的shell。如果命令包含未转义的百分比符号(%),则该百分比符号将被当作换行字符,且百分比符号之后的所有内容将传给stdin中的命令。

3.1.周期性用户作业示例

 - 以下作业将在每年2月2日上午9点准点执行命令 /usr/local/bin/yearly_backup

0 9 2 2 * /usr/local/bin/yearly_backup

 - 以下作业将在七月每周五的上午9点和5点间,每五分钟向该作业的所有者发送包含单词Chime的电子邮件

*/5 9-16 * Jul 5 echo "Chime"

  上文中9-16的小时范围表示作业定时器将在09:00启动并一直持续到16:59结束。作业将从09:00开始执行,在16:55结束执行,因为16:55再过五分钟是17:00,而这超出了给定的小时范围了。
 - 以下作业将在每个工作日午夜前的两分钟运行命令 /usr/local/bin/daily_report

58 23 * * 1-5 /usr/local/bin/daily_report

 - 以下作业将在每个工作日(周一到周五)上午9点执行mutt命令,从而将邮件消息Checking in发送给收件人boss@example.com

0 9 * * 1-5 mutt -s "Checking in" boss@example.com % Hi there boss, just checking in.

三、计划周期性系统作业

1. 描述周期性系统作业

  系统管理员经常需要运行周期性作业。最佳做法是从系统账户而不是从用户账户运行这些作业。也就是说,不要使用crontab命令来安排运行这些作业,而是要使用系统范围的crontab文件。系统范围的crontab文件中的作业条目与用户的crontab条目类似,唯一的不同是系统范围的crontab文件的命令字段前面有一个额外用户字段;此命令应在该用户的授权下运行。
/etc/crontab文件的随附注释中包含实用的语法图:

 # 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,par ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue ...
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

  周期性系统作业在两个位置定义: /etc/crontab 文件和 /etc/cron.d/ 目录中的文件。要计划周期性系统作业,应始终在 /etc/cron.d/ 目录下创建自定义crontab文件。通过将自定义crontab文件放入 /etc/cron.d,可以防止在 /etc/crontab 的供应商进行软件包更新时将它覆盖,因为更新可能会覆盖 /etc/crontab 中的现有内容。需要周期性系统作业的软件包会将其crontab文件放入包含作业条目的 /etc/cron.d/ 中。管理员也使用此位置将相关作业组合到单个文件中。
  crontab系统中还包含需要每小时、每天、每周和每月运行的脚本的存储库。这些存储库分别对应于名为 /etc/cron.hourly//etc/cron.daily//etc/cron.weekly//etc/cron.monthly/ 的目录。再次申明,这些目录中包含可执行的shell脚本,而不是crontab文件。
  一个从 /etc/cron.d/0hourly 文件调用的名为run-parts的命令可以运行 /etc/cron.hourly/* 脚本。run-parts命令也运行每日、每周和每月的作业,但它是从另一个名为 /etc/anacrontab 的配置文件调用的。
  /etc/anacrontab 旨在确保重要的作业始终运行,且不会因为系统在应执行作业时关闭或休眠而意外跳过。例如,如果由于系统重启而导致某个每日运行的系统作业上次未按时执行,则在系统就绪后就会执行此作业。但是,启动作业时可能会有几分钟的延迟,具体要视 /etc/anacrontab 中为该作业指定的Delay in minutes参数值而定。
  针对各个每日、每周和每月作业,/var/spool/anacron/ 中会有不同的对应文件,以确定特定的作业是否已运行。当crond从 /etc/anacrontab 中启动作业时,它会更新这些文件的时间戳。同一时间戳也用于确定作业上次运行的时间。/etc/anacrontab 的语法与其他常规crontab配置文件有所不同。它每行正好包含四个字段,如下所示:

  • 以天为单位
    按重复计划运行的作业的间隔天数。该字段接受整数或宏作为值。例如,宏 @daily 相当于整数1,它表示每天执行该作业。同样,宏 @weekly 相当于整数7,它表示每周执行该作业。
  • 延迟(分钟)
    在启动该作业时,crond守护进程应等待的时间
  • 工作号
    在日志消息中用于标识作业的唯一名称
  • 命令
    要执行的命令

  /etc/anacrontab文件中还包含使用语法name=value的环境变量声明。特别要注意其中的变量START_HOURS_RANGE,它指定了作业运行的时间间隔。超出此范围时,作业将不会启动。如果某一天作业在此时间间隔内未运行,则必须等到第二天才能执行此作业。

2. SYSTEMD定时器简介

  随着RHEL中systemd的出现,一种新的调度功能现已推出:systemd定时器单元。systemd定时器单元可以激活另一个不同类型的单元(例如某项服务),其单元名称与该定时器单元名称相匹配。定时器单元允许基于定时器来激活其他单元。为了便于调试,systemd将定时器事件记录在系统日志中。

2.1. 定时器单元示例

  sysstat软件包提供了一个名为sysstat-collect.timer的systemd定时器单元,它将每10分钟收集一次系统统计信息。以下输出显示了 /usr/lib/systemd/system/sysstat-collect.timer 的配置行。

...output omitted...
[Unit]
Description=Run system activity accounting tool every 10 minutes

[Timer]
onCalendar=*:00/10

[Install]
WantedBy=sysstat.service

  参数OnCalendar=*:00/10表示该定时器单元将每10分钟激活一次相应的单元(sysstat-collect.service)。不过,我们可以指定更复杂的时间间隔。例如,针对OnCalendar参数,值2019-03-*12:35,37,39:16将使定时器单元在2019年整个3月的每一天分别于12:35:16、12:37:16和12:39:16激活相应的服务单元。我们也可以使用参数(如OnUnitActiveSec)来指定相对定时器。例如,OnUnitActvieSec=15min选项将使定时器单元在该定时器单元最后一次激活其相应单元15分钟后触发相应的单元。
 更改定时器单元配置文件后,使用systemctl daemon-reload命令以确保systemd知道这些更改。该命令将重新加载systemd管理器配置。
 重新加载systemd管理器配置后,使用systemctl命令激活定时器单元

[root@host ~]$ systemctl daemon-reload
[root@host ~]$ systemctl enable --now <unitname>.timer

四、管理临时文件

1. 管理临时文件

  现代系统需要大量的临时文件和目录。有些应用(和用户)会使用 /tmp 目录来保存临时数据,还有一些应用(和用户)则使用更特定于任务的位置,如守护进程以及 /run 下特定于用户的易失性目录。就此而言,易失性意味着存储这些文件的文件系统只存在于内存中。在系统重新启动或断电时,易失性存储器的所有内容都会丢失。
  为保持系统充分运行,有必要创建那些不存在的目录和文件,因为守护进程和脚本可能会依靠它们的存在,而清除旧文件后就不会填满磁盘空间或提供错误信息。
  RHEL 7及更高版本中包含了一个名为systemd-tmpfiles的新工具,它提供了一种结构化和可配置的方法来管理临时目录和文件。
  在systemd启动系统后,其中一个最先启动的服务单元是systemd-tmpfiles-setup。该服务运行命令systemd-tmpfiles --create --remove。此命令从 /usr/lib/tmpfiles.d/*.conf/run/tmpfiles.d/*.conf/etc/tmpfiles.d/*.conf 读取配置文件。系统会删除这些配置文件中标记要删除的任何文件和目录,并且会创建标记要创建(或修复权限)的任何文件和目录,并使用拥有正确的权限(如有必要)。

1.1. 使用systemd定时器清理临时文件

  为确保长期运行的系统不会用陈旧数据填满磁盘,一个名为systemd-tmpfiles-clean.timer的systemd定时器单元会定期触发systemd-tmpfiles-clean.service来执行systemd-tmpfiles --clean命令。
  systemd定时器单元的配置文件中有一个 [Timer] 部分,它指示了启动同名服务的频率。
使用以下systemctl命令可以查看systemd.tmpfiles-clean.timer单元配置文件的内容:

[user@host ~]$ systemctl cat systemd-tmpfiles-clean.timer
# /usr/lib/systemd/system/systemd-tmpfiles-clean.timer
#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published
#  by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Daily Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd.tmpfiles(8)

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

  在上述配置中,参数OnBootSec=15min表示名为systemd-tmpfiles-clean.service的服务单元将在系统启动15分钟后被触发。参数OnUnitActiveSec=1d表示在上一次激活服务单元24小时后再次触发systemd-tmpfiles-clean.service服务单元的时间。
  根据个人要求,我们可以更改systemd-tmpfiles-clean.timer定时器单元配置文件中的参数。例如,参数OnUnitActiveSec的值为30min时,将在上一次激活服务单元30分钟后触发systemd-tmpfiles-clean.service服务单元。因此,在更改生效后将每30分钟触发一次systemd-tmpfiles-clean.service。
  更改定时器单元配置文件后,使用systemctl daemon-reload命令以确保systemd知道这些更改。该命令将重新加载systemd管理器配置。
  重新加载systemd管理器配置后,使用systemctl命令激活systemd-tmpfiles-clean.timer单元:

[root@host ~]$ systemctl daemon-reload
[root@host ~]$ systemctl enable --now systemd-tmpfiles-clean.timer

1.2. 手动清理临时文件

  命令systemd-tmpfiles --clean解析的配置文件与systemd-tmpfiles --create命令相同,但前者不会创建文件和目录,而是会清除在比配置文件中定义的最长期限更近的时间尚未访问、更改或修改的所有文件。
  tmpfiles.d(5)的man说明中详述了systemd-tmpfiles配置文件格式。基本语法由七列构成:类型、路径、模式、UID、GID、期限和参数。类型指的是systemd-tmpfiles应执行的操作,例如d表示创建还不存在的目录,或者z表示以递归方式恢复SELinux上下文以及文件权限和所有权。
部分示例及相关解释:

 d /run/systemd/seats 0755 root root -

在创建文件和目录时,如果目录 /run/systemd/seats 还不存在,则创建目录,所有者为用户root和组root,权限设置为 rwxr-xr-x。系统不会自动清除该目录。

 D /home/student 0700 student student 1d

如果目录 /home/student 还不存在,请创建该目录。如果存在,则清空其所有内容。运行systemd-tmpfiles --clean时,删除在超过一天时间内尚未被访问、更改或修改的所有文件。

 L /run/fstablink - root root - /etc/fstab

创建指向 /run/fstablink 的符号链接 /etc/fstab。绝对不要自动清除这一行。

1.3. 配置文件优先级

配置文件可放置于三个位置:

  • /etc/tmpfiles.d/*.conf
  • /run/tmpfiles.d/*.conf
  • /usr/lib/tmpfiles.d/*.conf
    /usr/lib/tmpfile.d/ 中的文件是由相关RPM软件包提供的,不应编辑这些软件;
    /run/tmpfiles.d/ 下的文件本身是易失性文件,通常由守护进程用来管理自己的运行时临时文件;
    /etc/tmpfiles.d/ 下的文件旨在供管理员配置自定义临时位置,以及覆盖供应商提供的默认值。
      如果 /run/tmpfiles.d/ 中的文件与 /usr/lib/tmpfiles.d/ 中的文件同名,则系统将使用 /run/tmpfiles.d/ 中的文件。如果 /etc/tmpfiles.d/ 中的文件与 /run/tmpfiles.d//usr/lib/tmpfiles.d/ 中的文件同名,则系统将使用 /etc/tmpfiles.d/ 中的文件。
      给定这些优先级规则后,我们将相关文件复制到 /etc/tmpfiles.d/,然后编辑该文件,即可轻松覆盖供应商提供的位置。如果以这种方式工作,则确保可从中央配置管理系统轻松管理管理员提供的设置,并且软件包的更新不会覆盖这些设置。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值