一、内容概要
1 . 设置将在某个时刻运行一次的命令。
2 . 利用 crontab,为用户设置重复运行的计划任务。
3 . 在系统 crontab 文件和目录中,设置命令重复运行的计划任务。
4 . 启用和禁用 systemd timer(定时器),并配置管理临时文件的定时器。
二、文章内容
1.描述延迟的用户任务
① 计划好运行的命令被称为任务或作业(task or job)
② at 软件包包含 atd 守护进程,和一组命令(at、atq 等)。在默认的
③ RHEL 安装过程中,将自动安装并启用 atd 守护进程
④ root 及普通用户可以使用 at 命令创建计划任务,atd 守护进程提 供 a-z
⑤ 共26个队列,按字母排序,越后面的队列优先级越低
(1)计划延迟的用户任务
①使用 at TIMESPEC 创建作业,at 从 stdin 中读取指令,直至 Ctrl+D 终止。
也支持从脚本中导入指令,例如:
at now +5min < myscript
②TIMESPEC 非常灵活,可以参考:/usr/share/doc/at/timespec
例:
- now +5min
- teatime tomorrow(下午 16:00)
- noon +4 days
- 5pm august 3 2021
(2)使用 atq 或 at -l 命令查看用户的待处理作业
①. 该作业的唯一编号;
②. 计划作业的执行日期和时间;
③. 表示作业已排入默认队列 a,不同的作业可以排入不同的队列中;
④. 作业所有者
注:普通用户只能查看和控制自己的作业。root 用户可以查看和管理所有作业
at -c JOBNUMBER 可以查看作业的详细信息
atrm JOBNUMBER 删除计划作业
(3)示例
①显示当前时间
date
②创建新的计划延时任务
将字符串 "'Hello world' > myjob.txt" 通过管道传递给 at 命令,并指定在当前时间的 3 分钟后执行。
echo 'echo "Hello world!" >> myjobs.txt' | at now + 3 minutes
③使用 atq 或 at -l 命令查看用户的待处理作业
Atq
at -l
④等待三分钟,查看myjobs.txt文件内容
cat myjobs.txt
2.周期性用户作业
(1)描述周期性用户作业
①按计划重复运行的作业被称为周期性作业
② crond 守护进程管理周期性作业,由 cronie 软件包提供,默认安装并启动
③crond 守护进程读取多个配置文件,crontab 命令编辑配置文件
④如果计划任务运行失败,crond 会发送邮件给指定用户
(2)计划周期性用户作业
命令 | 用途 |
crontab -l | 列出当前用户的计划作业 |
crontab -l | 删除当前用户的所有作业 |
crontab -e | 编辑当前用户的作业 |
crontab filename | 删除所有作业,并替换为filename 读取的作业。如果没有指定文件,则使用 stdin |
注意:crontab 命令使用 -u 选项,以此来管理其他用户的作业。 不推荐crontab 命令来管理系统作业,而应使用下一节中介绍的方法
(3)描述用户作业格式
crontab -e 调用 vim 进行计划任务的编辑,每行一个作业,支持空行和 # 注释行
crontab 的字段格式是:分钟 小时 日 月 星期 命令,其中日和星期是或的关系
前五个字段全部使用相同的语法规则:
- * 表示始终
- 数字可用于指定分钟数或小时数、日期或者工作日
- x-y 表示范围,x 到 y(含)
- x,y 表示列表,列表也可以包含范围
- */x 表示 x 的时间间隔
(4)示例:创建周期性用户作业
①显示当前时间
date
②创建周期性用户作业
crontab -e
*/2 * * * * echo "this is a test! $(date)" >> testjob.txt
退出编译
③检查周期性用户作业
使用crontab -1命令列出计划的周期性作业。检查上一步中计划作为周期性作业运行的命令。
crontab -l
④检查结果
等待几分钟后,用cat testjob.txt命令查看周期性用户作业的结果。
⑤删除计划以student用户身份运行的所有周期性作业。
使用crontab -r命令删除用户计划的所有周期性作业。
crontab -r
使用crontab -l验证是否删除周期性作业
crontab -l
3.周期性系统作业
(1)描述周期性系统作业
- 系统范围的 crontab 文件与用户的 crontab 类似,不同之处在于系统范围的 crontab 文件的命令字段前有一个额外的用户字段。
- 周期性系统作业应该在 /etc/cron.d 目录下创建自定义 crontab 文件。
- crontab 系统中还包含每小时、每天、每周和每月运行的脚本目录。这些目录中包含可执行的 shell 脚本,分别对应/etc/cron.hourly/、/etc/cron.daily/、/etc/cron.weekly/、/etc/cron.monthly/ 目录。
- /etc/cron.d/0hourly 文件调用 run-parts 命令运行 /etc/cron.hourly/* 脚本。
- /etc/anacrontab 文件调用 run-parts 命令运行每日、每周和每月的作业。
- /etc/anacrontab 确保重要的作业始终运行,不会因为系统关闭或休眠而意外跳过。例如,如果由于系统重启而导致某个每日运行的系统作业上次未按时执行,则在系统启动后就会执行此作业。
(2)SYSTEMD timer 简介
随着 systemd,RHEL7 开始启用了新的调度功能:systemd timer unit
systemd timer unit 激活另一个 unit,一般是与 timer unit 同名的 service
unit
(3)timer unit 举例
sysstat 软件包含有:sysstat-collect.timer,每隔10分钟收集系统统计信息,参考:/usr/lib/systemd/system/sysstat- collect.timer
OnCalendar 定义了时间间隔,表示方法很灵活,例如:2019-03-*12:35,37,39:16 表示 2019 年 3 月每一天的 12:35:16、12:37:16 和12:39:16
也可使用 OnUnitActiveSec,例如:OnUnitActiveSec=15min 表示每隔15分钟激活
注意:不要修改 /usr/lib/systemd/system 中配置文件,应该拷贝到 /etc/systemd/system 中并修改,以防因为软件包的更新被覆盖
更改 systemd 配置后,使用 systemctl daemon-reload 让 systemd 重新 加载配置。重新加载后,需要使用 systemctl 激活 timer unit
4.管理临时文件
(1)管理临时文件
有些应用(和用户)会使用 /tmp 目录来保存临时数据 还有一些应用(和用户)则使用特定位置,如 /run 下特定易失性目录
系统重新启动或断电时,易失性存储器的所有内容都会丢失,为保持系统充分运行,有必要创建这些不存在的目录和文件,因为守护进程和脚本可能会依靠它们的存在
RHEL7 及更高版本中包含了一个名为 systemd-tmpfiles 的新工具,它提供了一种结构化和可配置的方法来管理临时目录和文件在 systemd 启动系统后,其中一个最先启动的 service unit 是 systemd-tmpfiles-setup,该服务运行 systemd-tmpfiles -- create --remove 命令
此命令从 /usr/lib/tmpfiles.d/*.conf、/run/tmpfiles.d/*.conf 和 /etc/tmpfiles.d/*.conf 读取配置文件。系统会删除这些配置文件中标记要删除的文件和目录,并且会创建标记要创建(或修复权限)的文件和目录,并使其拥有正确的权限(如有必要)
(2)使用 Systemd timer 清理临时文件
名为 systemd-tmpfiles-clean.timer 的 systemd timer unit 会定期触发systemd-tmpfiles-clean.service 来执行 systemd-tmpfiles --clean命令
(3)手动清理临时文件
tmpfiles.d man page 介绍了 systemd-tmpfiles 的配置文件格式基本语法由七列构成:“类型”、“路径”、“模式”、“UID”、“GID”、 “期限”和“参数”
类型指的是 systemd-tmpfiles 应执行的操作
d 表示创建不存在的目录;Z 表示以递归方式恢复 SELinux context 及权限;D 表示如果目录不存在则创建该目录,如果存在则清除所有内容
运行 systemd-tmpfiles --clean时,删除超过一天时间内尚未被访问、更改或修改的所有文件
(4)配置文件的优先级
配置文件可位于三个位置:
- /etc/tmpfiles.d/*.conf 管理员自定义配置文件,优先级最高
- /run/tmpfiles.d/*.conf 内存中,由守护进程自己管理,优先级次之
- /usr/lib/tmpfiles.d/*.conf rpm 软件包提供,不要编辑,优先级最低
四、总结
•计划在将来运行一次的作业称为延迟作业或任务。
• 周期性用户作业可按重复的计划执行用户任务。
• 周期性系统作业则是按重复的计划完成影响整个系统的管埋任务。
• systemd 定时器单元既可以执行延迟作业,也可以执行周期性作业。