『學了就忘』Linux系統定時任務 — 87、只執行一次的定時任務

繁華似錦Fighting發表於2021-12-21

定時任務是在伺服器上常用到的一個工作。

在你指定的時間,系統會自動執行你指定的程式(指令碼或者命令)。

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檔案的,用到的時候需要自己手動建立。

具體規則如下:

  1. 如果系統中有/etc/at.allow檔案,那麼只有寫入/etc/at.allow檔案(白名單)中的使用者可以使用at命令,其他使用者不能使用at命令(/etc/at.deny檔案會被忽略,也就是說同一個使用者既寫入/etc/at.allow檔案,也寫入/etc/at.deny檔案,那麼這個使用者是可以使用at命令的,因為/etc/at.allow檔案優先順序更高。)。
  2. 如果系統中沒有/etc/at.allow檔案,只有/etc/at.deny檔案,那麼寫入/etc/at.deny檔案(黑名單)中的使用者不能使用at命令,其他使用者可以使用at命令。不過這個檔案對root使用者不生效。
  3. 如果系統中這兩個檔案都不存在,那麼只有root使用者可以使用at命令。
  4. 系統中預設時只有/etc/at.deny檔案,而且這個檔案是空的,這樣的話系統中所有的使用者都可以使用at命令。不過如果我們打算控制使用者的at命令許可權,把使用者寫入/etc/at.deny檔案即可。
  5. /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任務只能夠執行一次任務。

相關文章