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


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

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

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任務只能夠執行一次任務。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM