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