延時任務
在系統中我們的維護工作大多數時在服務器行對閑置時進行
我們需要用延遲任務來解決自動進行的一次性的維護 延遲任務時一次性的,不會重復執行
當延遲任務產生輸出后,這些輸出會以郵件的形式發送給延遲任務發起者
在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
重啟后還需要稍等服務器同步時間