延时任务
在系统中我们的维护工作大多数时在服务器行对闲置时进行
我们需要用延迟任务来解决自动进行的一次性的维护 延迟任务时一次性的,不会重复执行
当延迟任务产生输出后,这些输出会以邮件的形式发送给延迟任务发起者
在RHEL9中默认系统中的所有普通用户都可以发起延时任务
at命令
格式
at <参数> <时间>
参数
|----------------------------------------|---------------------------------------------|
| 不加参数直接跟<时间> | 在指定的时间执行延时任务 |
| now + <num> <min/hours/days/weeks> | 从现在开始num<minutes/hours/days/weeks>后执行延时任务 |
| -m | 当任务完成之后,即使没有标准输出,将给用户发送邮件 |
| -l (atq) | 可列出目前系统上面的所有该用户的at调度 |
| -d (atrm) | 可以取消一个在at调度中的工作 |
| -v | 使用较明显的时间格式,列出at调度中的任务列表 |
| -c | 可以列出后面接的该项工作的实际命令内容 |
| -f | 从文件中读取作作业 |
其中不加参数直接跟时间的格式可以为
HH:MM
HH:MM YYYY-MM-DD
at + <hh:mm>(想要延时任务执行的时间)
bash
at <时间>
如图我在19:12:40的时候想在19:14执行延时任务
root@localhost \~\]# at 19:14 warning: commands will be executed using /bin/sh at\> touch /mnt/vb{1..5} at\>\
job 1 at Tue Apr 22 19:14:00 2025
在编写完延时任务后,我们需要回车进入下一行然后按下ctrl + D结束编写延时任务,并生成延时任务进入延时任务队列。

当时间来到19:14:01时,延时任务已经自动执行完毕,生成了对应的文件。

now+<num>min 在输入at命令回车的那一刻延时n分钟后的任务


非交互执行at延时任务
在任意位置用vim编写一个脚本文件
使用多行重定向输入

使用sh命令执行脚本文件,就可以实现非交互式生成延时任务并执行



-r 删除延时任务
bash
at -r <对应的延时任务序号>

-d 删除对应代号的延时任务

-v 显示延时任务将会在何时执行

-V 查看at的版本

-c 可以列出后面接的该项工作的实际命令内容


-f 从文件中读取作作业

-m 任务完成后给用户发送
安装postfix
bash
dnf install postfix.x86_64

安装s-nail
bash
dnf install s-nail.x86_64

touch命令的执行后是不会返回输出信息到终端的
但是-m参数会强制执行at任务后无论是否返回输出信息都发送邮件给用户

可以用mail来查看邮件
按数字顺序编号进行查看第几封邮件
用q键退出mail模式

延迟任务的安全优化

/etc/at.deny 使用at的黑名单


/etc/at.allow 使用at的白名单
注意:初始的主机是没有at.allow这个文件的!如有需要则要用户自己创建
一旦创建了at.allow这个文件,所有用户都会被禁止使用at命令除了root用户。


注意:当存在at.allow文件时,
at.allow文件里的用户名与at.deny文件里的用户名重复时
系统会允许那个用户执行at命令
crontab
检查crond服务是否开启

编写系统定时任务

其中* * * * *的含义是每月每周每天每小时每分钟执行一次命令
-r 删除

-i 显示删除提示

-l 列出用户的crontab

|------|------|----|----|----|---------------------------|
| 分钟 | 小时 | 天 | 月 | 周 | 定时效果 |
| * | * | * | * | * | 每小时的每分钟的01秒触发 |
| */n | * | * | * | * | 每隔n分钟的01秒触发 |
| n | * | * | * | * | 每小时的过n分钟 |
| n | a~b | * | * | * | 从a点到b点中间每个小时的过n分钟 |
| n | * | a | b | c | b月a日每小时过n分 b月的每个周c的每小时过n分 |
注:天和周是分开约定的
0和7都表示周日
系统级别的定时任务

在/etc/cron.d/下编写定时任务

每到设定的周期时间时系统则会自动执行
如图来到18:53时,系统自动创建了vba和vbb这两个文件

系统级别的定时任务执行完后,要记得及时删除否则会占用系统资源!

手动更改主机时间
查看当前主机的时间
timedatectl

先关闭时间同步
bash
systemctl stop chronyd.service

更改主机时间
bash
timedatectl set-time "yyyy-mm-dd hh:mm:ss"
这里成功更改主机时间为2077-7-7 7:07:07
手动更改主机时区
查看时区地区表
bash
timedatectl list-timezones

从时区地区表选择地区进行更改


同理更改为其他地区也是可以的,下图更改为了阿曼

手动更改主机时间模式
bash
timedatectl set-local-rtc <true/false>
启用本地时间模式

将 RTC 设置为UTC模式

更改授时源
编写系统中配置 Chrony 服务的配置文件
vim /etc/chrony.conf

将框住的部分更改为网络上能找到的授时源

重启chronyd.service服务让主机与授时服务器重新同步时间
bash
systemctl restart chronyd.service
重启后还需要稍等服务器同步时间
