Linux中的系统延时任务和定时任务与时间同步服务和构建时间同步服务器
延时任务
在系统中我们的维护工作大多数时在服务器行对闲置时进行
我们需要用延迟任务来解决自动进行的一次性的维护 延迟任务时一次性的,不会重复执行
当延迟任务产生输出后,这些输出会以邮件的形式发送给延迟任务发起者
在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>(想要延时任务执行的时间)
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><EOT>
job 1 at Tue Apr 22 19:14:00 2025
在编写完延时任务后,我们需要回车进入下一行然后按下ctrl + D结束编写延时任务,并生成延时任务进入延时任务队列。
当时间来到19:14:01时,延时任务已经自动执行完毕,生成了对应的文件。
now+<num>min 在输入at命令回车的那一刻延时n分钟后的任务
非交互执行at延时任务
在任意位置用vim编写一个脚本文件
使用多行重定向输入
使用sh命令执行脚本文件,就可以实现非交互式生成延时任务并执行
-r 删除延时任务
at -r <对应的延时任务序号>
-d 删除对应代号的延时任务
-v 显示延时任务将会在何时执行
-V 查看at的版本
-c 可以列出后面接的该项工作的实际命令内容
-f 从文件中读取作作业
-m 任务完成后给用户发送
安装postfix
dnf install postfix.x86_64
安装s-nail
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
先关闭时间同步
systemctl stop chronyd.service
更改主机时间
timedatectl set-time "yyyy-mm-dd hh:mm:ss"
这里成功更改主机时间为2077-7-7 7:07:07
手动更改主机时区
查看时区地区表
timedatectl list-timezones
从时区地区表选择地区进行更改
同理更改为其他地区也是可以的,下图更改为了阿曼
手动更改主机时间模式
timedatectl set-local-rtc <true/false>
启用本地时间模式
将 RTC 设置为UTC模式
更改授时源
编写系统中配置 Chrony 服务的配置文件
vim /etc/chrony.conf
将框住的部分更改为网络上能找到的授时源
重启chronyd.service服务让主机与授时服务器重新同步时间
systemctl restart chronyd.service
重启后还需要稍等服务器同步时间