首頁 > linux教程 > Linux系統管理 閱讀:0更新時間:2020-03-28 01:05:16

Linux at命令詳解:定時執行任務

要想使用 at 命令,讀者需提前安裝好 at 軟件包,并開啟 atd 服務。因此,首先來看看如何安裝 at 軟件包。

linux 系統中,查看 at 軟件包是否已安裝,可以使用 rpm -q 命令,如下所示:

[root@localhost ~]# rpm -q at
at-3.1.13-20.el7x86_64

可以看到,當前系統已經安裝 at 軟件包,若讀者所用系統未安裝,可使用如下命令進行安裝:

[root@localhost ~]# yum -y install at
#省略輸出信息,最終出現 Complete!,證明安裝成功。


除此之外,at 命令要想正確執行,還需要 atd 服務的支持。atd 服務是獨立的服務,啟動的命令如下:

[root@localhost ~]# service atd start
正在啟動 atd: [確定]

如果想讓 atd 服務開機時自啟動,則可以使用如下命令:

[root@localhost ~]# chkconfig atd on

當然,獨立服務的自啟動也可以修改 /etc/rc.local 配置文件,具體怎么做看個人習慣。

安裝好 at 軟件包并開啟 atd 服務之后,at 命令才可以正常使用,不過在此之前,我們還要學習一下 at 命令的訪問控制。

訪問控制指的是允許哪些用戶使用 at 命令設定定時任務,或者不允許哪些用戶使用 at 命令。大家可以將其想象成設定黑名單或白名單,這樣更容易理解。

at 命令的訪問控制是依靠 /etc/at.allow(白名單)和 /etc/at.deny(黑名單)這兩個文件來實現的,具體規則如下:
  • 如果系統中有 /etc/at.allow 文件,那么只有寫入 /etc/at.allow 文件(白名單)中的用戶可以使用 at 命令,其他用戶不能使用 at 命令(注意,/etc/at.allow 文件的優先級更高,也就是說,如果同一個用戶既寫入 /etc/at.allow 文件,又寫入 /etc/at.deny 文件,那么這個用戶是可以使用 at 命令的)。
  • 如果系統中沒有 /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.deny 文件的優先級,我們做一個實驗來驗證一下,命令如下:

[root@localhost ~]# ls -l /etc/at*
-rw-r--r--.1 root root 1 1月 30 2012 /etc/at.deny
#系統中默認只有at.deny文件
[root@localhost ~]# echo user1 >> /etc/at.deny
[root@localhost ~]# cat /etc/at.deny
user1
#把user1用戶寫入/etc/at.deny文件
[root@localhost ~]# su - user1
[user1@localhost ~]$ at 02:00
You do not have permission to use at.
#沒有權限使用at命令,切換成user1用戶,這個用戶已經不能執行at命令了
[user1@localhost ~]$ exit
logout
#返回root身份
[root@localhost ~]# echo user1 >> /etc/at.allow
[root@localhost ~]# cat /etc/at.allow
user1
#建立/etc/at.allow文件,并在文件中寫入user1用戶
[root@localhost ~]# su - user1
[user1@localhost ~]$ at 02:00
at>
#切換成user1用戶,user1用戶可以執行at命令。這時user1用戶既在/etc/at.deny文件中,又在/etc/at.allow文件中,但是/etc/at.allow文件的優先級更高
[user1@localhost ~]$ exit
logout
#返回root身份
[root@localhost ~]# at 02:00
at>
#root用戶雖然不在/etc/at.allow文件中,但是也能執行at命令,
#root用戶雖然不在/etc/at.allow文件中,但是也能執行at命令,
#說明root用戶不受這兩個文件的控制

這個實驗說明了 /etc/at.allow 文件的優先級更高,如果 /etc/at.allow 文件存在,則 /etc/at.deny 文件失效。/etc/at.allow 文件的管理更加嚴格,因為只有寫入這個文件的用戶才能使用 at 命令,如果需要禁用 at 命令的用戶較多,則可以把少數用戶寫入這個文件。/etc/at.deny 文件的管理較為松散,如果允許使用 at 命令的用戶較多,則可以把禁用的用戶寫入這個文件。不過這兩個文件都不能對 root 用戶生效。

接下來正式介紹 at 命令。at 命令的格式非常簡單,基本格式如下:

[root@localhost ~] # at [選項] [時間]

有關此命令常用的幾個選項及各自含義如表 1 所示。

表 1 at 命令選項及含義
選項 含義
-m 當 at 工作完成后,無論命令是否輸出,都用 E-mail 通知執行 at 命令的用戶。
-c 工作標識號 顯示該 at 工作的實際內容。
-t 時間 在指定時間提交工作并執行,時間格式為 [[CC]YY]MMDDhhmm。
-d 刪除某個工作,需要提供相應的工作標識號(ID),同 atrm 命令的作用相同。
-l 列出當前所有等待運行的工作,和 atq 命令具有相同的額作用。
-f 腳本文件 指定所要提交的腳本文件。

另外,表 2 羅列了此命令中關于時間參數可用的以下格式。

表 2 at 命令時間參數可用格式
格式 用法
HH:MM 比如 04:00 AM。如果時間已過,則它會在第二天的同一時間執行。
Midnight(midnight) 代表 12:00 AM(也就是 00:00)。
Noon(noon) 代表 12:00 PM(相當于 12:00)。
Teatime(teatime) 代表 4:00 PM(相當于 16:00)。
英文月名 日期 年份 比如 January 15 2018 表示 2018 年 1 月 15 號,年份可有可無。
MMDDYY、MM/DD/YY、MM.DD.YY 比如 011518 表示 2018 年 1 月 15 號。
now+時間 以 minutes、hours、days 或 weeks 為單位,例如 now+5 days 表示命令在 5 天之后的此時此刻執行。

at 命令只要指定正確的時間,就可以輸入需要在指定時間執行的命令。這個命令可以是系統命令,也可以是 shell 腳本。舉幾個例子。

【例 1】

[coot@localhost ~]# cat /root/hello.sh
#!/bin/bash
echo "hello world!!"
#該腳本會打印"hello world!!"
[root@localhost ~]# at now +2 minutes
at> /root/hello.sh >> /root/hello.log
#執行hello.sh腳本,并把輸出寫入/root/hello.log文件
at> <EOT>
#使用Ctrl+D快捷鍵保存at任務
job 8 at 2013-07-25 20:54 #這是第8個at任務,會在2013年7月25日20:54執行
[root@localhost ~]# at -c 8
#查詢第8個at任務的內容
...省略部分內容...
#主要定義系統的環境變量
/root/hello.sh >> /root/hello.log
#可以看到at執行的任務


【例 2】

[root@localhost ~J# at 02:00 2013-07-26
at> /bin/sync
at> /sbin/shutdown -h now
at> <EOT>
job 9 at 2013-07-26 02:00
#在指定的時間關機。在一個at任務中是可以執行多個系統命令的

在使用系統定時任務時,不論執行的是系統命令還是 Shell 腳本,最好使用絕對路徑來寫命令,這樣不容易報錯。at 任務一旦使用 Ctrl+D 快捷鍵保存,實際上寫入了 /var/spool/at/ 這個目錄,這個目錄內的文件可以直接被 atd 服務調用和執行。

表 1 中提到了 atq 命令和 atrm 命令。atq 命令用于查看當前等待運行的工作,atrm 命令后者用于刪除指定的工作,它們的使用方法也很簡單,這里給大家舉幾個簡單的例子。

【例 3】atq 命令的用法。

[root@localhost ~]# atq
9 2013-07-26 02:00 a root
#說明root用戶有一個at任務在2013年7月26日02:00執行,工作號是9
[root@localhost ~]# atrm [工作號]
#刪除指定的at任務


【例 4】atrm 命令的用法。

[root@localhost ~]# atrm 9
[root@localhost ~]# atq
#刪除9號at任務,再查詢就沒有at任務存在了

beylze編程學院,一個分享編程知識和seo優化知識的網站。跟著beylze一起學習,每天都有進步。

通俗易懂,深入淺出,一篇文章只講一個知識點。

文章不深奧,不需要鉆研,在公交、在地鐵、在廁所都可以閱讀,隨時隨地漲姿勢。

文章不涉及代碼,不燒腦細胞,人人都可以學習。

當你決定關注beylze(公眾號:beylze),你已然超越了90%的其他從業者!

相關文章

優秀教程

国产亚洲欧美日韩