『學了就忘』Linux系統定時任務 — 87、只執行一次的定時任務
- 2021 年 12 月 21 日
- 筆記
- 測試基礎必會技能 - Linux系統
定時任務是在服務器上常用到的一個工作。
在你指定的時間,系統會自動執行你指定的程序(腳本或者命令)。
Linxu系統中的定時任務不難,關鍵是如何寫出正確的腳本。
在Linxu系統中,有三種用於任務調度的工具:
at命令調用atd服務crontab命令調用cron(crond)服務。anacron工具。
只執行一次的定時任務需使用at命令。
at命令是一次性執行的定時任務。也就是說我在之後什麼時間點,執行一次任務。
1、at服務管理
at命令要想正確執行,需要atd服務的支持。
atd服務是獨立的服務,所以啟動的命令如下:
[root@localhost ~]# service atd start
提示:
只要你的Linux系統是安裝的,哪怕是最小化安裝,
at命令和cron命令默認都是啟動的。我們發現大多數服務最後都有個
d,這個d代表Daemon(守護進程)的意思。
# 查看Linux系統中的進程
# 注意:第二行/usr/sbin/atd,才是atd服務。
[root@localhost ~]# ps aux | grep atd
rpcuser 1425 0.0 0.0 23352 1380 ? Ss 06:15 0:00 rpc.statd
root 1881 0.0 0.0 21108 496 ? Ss 06:15 0:00 /usr/sbin/atd
root 3332 0.0 0.0 103332 852 pts/2 S+ 09:29 0:00 grep atd
如果想要讓atd服務開機時自動啟動,可以設置如下命令:
[root@localhost ~]# chkconfig atd on
2、at命令的訪問控制
atd服務啟動之後,at命令才可以正常使用,我們還要學習下at命令的訪問控制。
這裡的訪問控制指的是允許哪些用戶使用at命令設定定時任務,或者不允許哪些用戶使用at命令。
大家可以想像成為設定黑名單或設定白名單,這樣更容易理解。at的訪問控制是依靠/etc/at.allow文件(白名單)和/etc/at.deny文件(黑名單)這兩個文件來實現的。
注意:Linux系統中默認是沒有
/etc/at.allow文件的,用到的時候需要自己手動創建。
具體規則如下:
- 如果系統中有
/etc/at.allow文件,那麼只有寫入/etc/at.allow文件(白名單)中的用戶可以使用at命令,其他用戶不能使用at命令(/etc/at.deny文件會被忽略,也就是說同一個用戶既寫入/etc/at.allow文件,也寫入/etc/at.deny文件,那麼這個用戶是可以使用at命令的,因為/etc/at.allow文件優先級更高。)。 - 如果系統中沒有
/etc/at.allow文件,只有/etc/at.deny文件,那麼寫入/etc/at.deny文件(黑名單)中的用戶不能使用at命令,其他用戶可以使用at命令。不過這個文件對root用戶不生效。 - 如果系統中這兩個文件都不存在,那麼只有
root用戶可以使用at命令。 - 系統中默認時只有
/etc/at.deny文件,而且這個文件是空的,這樣的話系統中所有的用戶都可以使用at命令。不過如果我們打算控制用戶的at命令權限,把用戶寫入/etc/at.deny文件即可。 /etc/at.allow文件的權限更高,如果/etc/at.allow文件存在,則/etc/at.deny文件失效。
/etc/at.allow管理行為更加嚴格,因為只有寫入這個文件的用戶才能使用at命令,如果需要禁用at命令的用戶較多,則可以把少數用戶寫入這個文件。
/etc/at.deny文件的管理較為鬆散,如果允許使用at命令的用戶較多,則可以把禁用的用戶寫入這個文件。
不過這兩個文件都不能對root用戶生效。
3、at命令
格式如下:
[root@localhost ~]# at [選項] 時間
選項:
-m:當at命令工作完成後,無論是否命令有輸出,都用email通知執行at命令的用戶。
-c工作號:顯示該at工作的實際內容。
時間:
at支持的時間格式如下:
HH:ММ 在指定的「小時:分鐘」執行命令,例如:05:30。
HH:MM YYYY-MM-DD 在指定的「小時:分鐘 年-月-日」執行,例如05:30 2020-06-26。
HH:MM[am|pm][month][date] 在指定的「小時:分鐘[上午|下午][月][日]「執行,例如05:30 July 25。
HH:MM[amlpm]+[minutes|hours|days|weeks] 在指定的時間「再加多久執行」,
例now + 5 minutes,05am + 2 hours。
at命令只要指定正確的時間,就可以輸入需要在指定時間執行的命令了.這個命令可以是系統令,也可以是shell腳本。(也就是說確認命令的執行時間之後,按回車在輸入你要執行的命令。)
示例:
# 1.編寫一個shell腳本hello.sh
[root@localhost ~]# cat /root/hello. sh
#!/bin/bash
echo "hello world!!!!"
# 2.使用at命令在某個時間點執行該腳本
[root@localhost ~]# at now + 2 minutes
# 回車後,輸入需要執行的命令
# 把hello.sh腳本輸入的內容,寫入指定的文件中
at> /root/hello.sh >> /root/hello.log
# 使用ctrltd 保存at任務
at> <EOT>
job 1 at 2020-06-25 18:58
# 會提示你,第1個at任務,會在2020年6月25日18:58分執行
# 這個1代表工作號
查詢指定的定時任務:
# 查詢第1個at任務的內容
# 可以看到at執行的任務內容
[root@localhost ~]# at -c 1(工作號)
# 可以看到有很多的內容
# 前面主要是定義系統的環境變量
# 最後面的
/root/hello.sh >>/root/hel1o.1og
提示:
我們可以通過下面的
atq命令查看到,Linux系統中at任務列表中,你所需要任務的工作號,然後在通過at -c (工作號)命令來查看一個at任務的具體內容。
在一個at任務中執行多個系統命令:
# 在指定的時間關機。
[root@localhost ~]# at 02:00 2020-06-26
at> /bin/sync
at> /sbin/shutdown -h now
at> <EOT>
job 1 at 2020-06-26 02:00
4、其他at管理命令
at還有查詢(atq)命令和刪除(atrm)命令。
命令如下:
# 1.查詢當前服務器上的at工作
[root@localhost ~]# atq
例如:
# 說明:root用戶有一個at在務在2020年6月25日的18:58執行,工作號是1
[root@localhost ~]# atq
1 2020-06-25 18:58 a root
# 通過atq命令查看at定時任務,只能看到工作號,執行時間,哪個用戶執行
# 但是看不到具體執行的命令是什麼,
# 2.刪除指定的at在務
[root@localhost ~]# atrm [工作號]
例如:
# 刪除1號at任務,然後通過atq命令查詢就沒有at任務存在了
[root@localhost ~]# atrm 1
5、總結
at命令平時用的並不多,因為at任務只能夠執行一次任務。


