定時任務是在伺服器上常用到的一個工作。
在你指定的時間,系統會自動執行你指定的程式(指令碼或者命令)。
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
任務只能夠執行一次任務。