使用at命令在Linux上安排任務(wù)
at 命令可以很容易地安排 Linux 任務(wù)在你選擇的任何時(shí)間或日期運(yùn)行,讓我們來看看它能為你做什么。
當(dāng)你希望命令或腳本在某個(gè)特定時(shí)間運(yùn)行時(shí),你不需要將手指放在鍵盤上盤旋等待按下回車鍵,或者是在特定時(shí)間坐在辦公桌前。相反,你可以通過 at 命令來設(shè)置任務(wù)。在本文中,我們將研究如何使用 at 來安排任務(wù),如何精確地選擇任務(wù)希望運(yùn)行的時(shí)間,以及如何使用 at 來查看安排運(yùn)行的任務(wù)。
at vs cron
對于那些使用 cron 在 Linux 系統(tǒng)上安排任務(wù)的人來說,at 命令類似于 cron,因?yàn)槟憧梢栽谶x定的時(shí)間調(diào)度任務(wù),但是 cron 用于定期運(yùn)行的作業(yè) —— 甚至是每年僅一次。大多數(shù) cron 作業(yè)的頻率都設(shè)置為每天、每周或每月運(yùn)行一次,不過你可以控制運(yùn)行的頻率和時(shí)間。
另一方面,at 命令用于僅運(yùn)行一次的任務(wù)。想在午夜重啟系統(tǒng)?沒問題,只要你有適當(dāng)?shù)臋?quán)限,at 可以為你完成此操作。如果你希望系統(tǒng)在每個(gè)星期六凌晨 2 點(diǎn)重啟,那么改用 cron。
使用 at
at 命令很容易使用,只需記住幾件事。一個(gè)簡單使用 at 的例子類似于這樣:
$ at 5:00PMat> date >> thisfileat> <EOT>
在輸入 at 和應(yīng)該運(yùn)行命令的時(shí)間,at 會(huì)提示你在設(shè)定時(shí)間會(huì)運(yùn)行該命令(此例中是 date 命令)。輸入 ^D(Ctrl + d)來完成請求。
假設(shè)我們在下午 5 點(diǎn)之前設(shè)置這個(gè) at 命令,那么這個(gè)日期和時(shí)間將在當(dāng)天下午 5 點(diǎn)添加到名為 thisfile 文件的末尾。否則,該命令將在第二天下午 5 點(diǎn)運(yùn)行。
與 at 命令進(jìn)行交互時(shí),可以輸入多個(gè)命令。如果你要同時(shí)運(yùn)行多個(gè)命令,只需輸入多個(gè)命令行即可:
$ at 6:22warning: commands will be executed using /bin/shat> echo first >> thisfileat> echo second >> thisfileat> <EOT>
在上面的命令中,我們使用了一個(gè)普通的用戶賬戶,將一些簡單的文本添加到該用戶主目錄的文件中。如果在上午 6:22 之后運(yùn)行這些命令,那么命令會(huì)在第二天運(yùn)行,因?yàn)?6:22 表示上午 6:22。如果你想在下午 6:22 運(yùn)行,使用 6:22 PM 或者 18:22。6:22 PM 這樣也是可以工作的。
你也可以通過使用 at 來安排命令在指定的日期或時(shí)間運(yùn)行,例如 10:00AM April 15 2021 或 noon + 5 days(從今天起 5 天內(nèi)的中午運(yùn)行),以下是一些例子:
at 6PM tomorrowat noon April 15 2021at noon + 5 daysat 9:15 + 1000 days
在指定要運(yùn)行的命令并按下 ^D 后,你會(huì)注意到 at 命令為每個(gè)請求分配了一個(gè)作業(yè)編號,這個(gè)數(shù)字將顯示在 at 命令的作業(yè)隊(duì)列中。
$ at noon + 1000 dayswarning: commands will be executed using /bin/shat> date >> thisfileat> <EOT>job 36 at Tue Dec 27 12:00:00 2022 <== job # is 36
檢查隊(duì)列
你可以使用 atq(at queue)命令來查看 at 作業(yè)隊(duì)列:
$ atq32 Thu Apr 2 03:06:00 2020 a shs35 Mon Apr 6 12:00:00 2020 a shs36 Tue Dec 27 12:00:00 2022 a shs34 Thu Apr 2 18:00:00 2020 a shs
如果你需要取消隊(duì)列中的一個(gè)作業(yè),使用 atrm(at remove)命令和作業(yè)編號:
$ atrm 32$ atq35 Mon Apr 6 12:00:00 2020 a shs36 Tue Dec 27 12:00:00 2022 a shs34 Thu Apr 2 18:00:00 2020 a shs
你可以使用 at -c 命令來查看安排任務(wù)的詳細(xì)信息,其它詳細(xì)信息(活動(dòng)的搜索路徑等)也可以看到,但是輸出的最后一行將顯示計(jì)劃運(yùn)行的命令。
$ at -c 36 | tail -6cd /home/shs || {echo 'Execution directory inaccessible' >&2exit 1}date >> thisfile
注意,該命令顯示首先會(huì)測試是否可以通過 cd 命令進(jìn)入用戶目錄。如果不可以,作業(yè)將退出并顯示錯(cuò)誤。如果可以,則運(yùn)行在 at 中指定的命令。它將命令視為 “進(jìn)入 /home/shs 或退出并顯示錯(cuò)誤”。
以 root 身份運(yùn)行作業(yè)
要以 root 身份運(yùn)行 at 作業(yè),只需將 sudo 與你的 at 命令一起使用,如下所示:
$ sudo at 8PM[sudo] password for shs:warning: commands will be executed using /bin/shat> reboot nowat> <EOT>job 37 at Wed Apr 1 16:00:00 2020
注意,root 的任務(wù)以 root 作為執(zhí)行者顯示在隊(duì)列中。
35 Mon Apr 6 12:00:00 2020 a shs36 Tue Dec 27 12:00:00 2022 a shs37 Wed Apr 1 20:00:00 2020 a root <==
運(yùn)行腳本
你還可以使用 at 命令來運(yùn)行腳本,這里有一個(gè)例子:
$ at 4:30PMwarning: commands will be executed using /bin/shat> bin/trymeat> <EOT>
禁止使用 at 命令
/etc/at.deny 文件提供了一種禁止用戶使用 at 命令的方法。默認(rèn)情況下,它可能會(huì)包含一個(gè)不允許的賬戶列表,例如 ftp 和 nobody。可以使用 /etc/at.allow 文件執(zhí)行相反的操作,但是通常只配置 at.deny 文件。
總結(jié)
當(dāng)你要安排一項(xiàng)一次性任務(wù)時(shí),無論你是希望在今天下午或幾年后運(yùn)行,at 命令都是通用且易于使用的。 















 
 
 






 
 
 
 