一篇學(xué)會(huì) Linux at 命令詳解
大家好,我是良許。
生活中,我們有太多場(chǎng)景需要使用到鬧鐘,比如早上 7 點(diǎn)起床,下午 4 點(diǎn)開(kāi)會(huì),晚上 8 點(diǎn)購(gòu)物,等等。
在 Linux 系統(tǒng)里,我們同樣也有類(lèi)似的需求。比如我們想在凌晨 1 點(diǎn)將文件上傳服務(wù)器,或者在晚上 10 點(diǎn)確認(rèn)系統(tǒng)狀態(tài),等等。
但我們不可能一直守在電腦前,畢竟我們也需要下班/睡覺(jué),還要陪女朋友(new一個(gè)也行)。而且即使在上班期間,如果到點(diǎn)了還需要人工操作,未免效率太低了。
at 命令就是為這個(gè)需求而誕生的。使用 at 命令,你可以在特定時(shí)間自動(dòng)完成你所設(shè)定的任務(wù),也可以實(shí)現(xiàn)自動(dòng)化,非常方便快捷!
安裝 at 命令
一般來(lái)講,大部分 Linux 發(fā)行版都已經(jīng)安裝了 at 命令,不確定的話(huà)可以使用 at -V 命令查看,如果有版本返回,說(shuō)明就可以正常使用 at 命令。
- $ at -V
- at version 3.1.13
你可能還需要啟動(dòng) at 守護(hù)進(jìn)程,稱(chēng)為 atd 。在大多數(shù) Linux 系統(tǒng)上,你可以使用 systemctl 命令啟用 atd 服務(wù)并將它們?cè)O(shè)置為從現(xiàn)在開(kāi)始自動(dòng)啟動(dòng):
- $ sudo systemctl enable --now atd
at 命令基本用法
語(yǔ)法
- at [選項(xiàng)] [日期時(shí)間]
選項(xiàng)
- -f:指定包含具體指令的任務(wù)文件
- -q:指定新任務(wù)的隊(duì)列名稱(chēng)
- -l:顯示待執(zhí)行任務(wù)的列表
- -d:刪除指定的待執(zhí)行任務(wù)
- -m:任務(wù)執(zhí)行完成后向用戶(hù)發(fā)送 E-mail
參數(shù)
日期時(shí)間:指定任務(wù)執(zhí)行的日期時(shí)間
使用 at 命令交互性安排任務(wù)
想想看,我們平時(shí)是怎么使用鬧鐘這個(gè)工具的?首先我們點(diǎn)擊鬧鐘軟件上的加號(hào),然后再設(shè)定時(shí)間,再在備注里輸入鬧鐘的目的。
使用 at 命令交互性安排任務(wù)也是一樣的道理。首先你輸入 at 命令,然后再跟上具體的時(shí)間。
回車(chē)之后就進(jìn)入到交互性界面,你再具體輸入要做的事情(命令),最后以結(jié)束輸入,任務(wù)就設(shè)置好了。
例如,你想在早上 11:20 的時(shí)候,在 at-test.txt 文檔里寫(xiě)入 hello world 這句話(huà),可以這樣交互性輸入:
- $ at 11:20 AM
- warning: commands will be executed using /bin/sh
- at> echo "hello world" > ~/at-test.txt
- at> <EOT>
- job 3 at Mon Jul 26 11:20:00 2021
如上所示,at 命令使用直觀和自然的時(shí)間格式。你不需要知道 24 小時(shí)制或?qū)r(shí)間轉(zhuǎn)換為 UTC 格式。通常,可以直接使用我們生活中常用的單詞它就能理解,例如noon、 1:30 PM、 13:37等。
在 11:20 過(guò)后,你可以使用 cat 命令檢查一下 at-test.txt 文件是否有內(nèi)容寫(xiě)入:
- $ cat ~/at-test.txt
- hello world
使用 at 命令安排任務(wù)
如果你不想使用交互的方式來(lái)給 at 命令安排任務(wù),可以使用管道將 echo 或 printf 的值傳遞給 at 命令。
比如,我想從現(xiàn)在開(kāi)始一分鐘后向 at-test.txt 文件寫(xiě)入 hello again 語(yǔ)句:
- $ echo "echo 'hello again' >> ~/at-test.txt" | at now +1 minute
一分鐘后,驗(yàn)證新命令是否已執(zhí)行:
- $ cat ~/at-test.txt
- hello world
- hello again
時(shí)間表達(dá)式
前面提到過(guò),at 命令使用的是我們?nèi)粘I钪兴褂玫臅r(shí)間格式,非常方便:
- YYMMDDhhmm[.ss] (縮寫(xiě)年、月、日、小時(shí)、分鐘[秒])
- CCYYMMDDhhmm[.ss] (完整年、月、日、小時(shí)、分鐘和[秒])
- now
- midnight
- noon
- teatime`(下午4點(diǎn))
- AM
- PM
時(shí)間和日期可以是絕對(duì)的,也可以添加一個(gè)加號(hào) ( + ) 使它們相對(duì)于現(xiàn)在。在指定相對(duì)時(shí)間時(shí),下面這些日常生活中所使用的詞匯都可以使用:
- minutes
- hours
- days
- weeks
- months
- years
下面是一些 at 命令有效表達(dá)式的示例:
- $ echo "rsync -av /home/tux me@myserver:/home/tux/" | at 3:30 AM tomorrow
- $ echo "/opt/batch.sh ~/Pictures" | at 3:30 AM 08/01/2022
- $ echo "echo hello" | at now + 3 days
查看 at 任務(wù)隊(duì)列
隨時(shí)時(shí)間的推移,我們可以忘記在 at 命令隊(duì)列時(shí)設(shè)置了多少個(gè)任務(wù),如果你想進(jìn)行查看,可以使用 atq 命令:
- $ atq
- 10 Thu Jul 29 12:19:00 2021 a tux
- 9 Tue Jul 27 03:30:00 2021 a tux
- 7 Tue Jul 27 00:00:00 2021 a tux
要從隊(duì)列中刪除任務(wù),請(qǐng)使用 atrm 命令和任務(wù)編號(hào)。例如要?jiǎng)h除任務(wù) 7 :
- $ atrm 7
- $ atq
- 10 Thu Jul 29 12:19:00 2021 a tux
- 9 Tue Jul 27 03:30:00 2021 a tux
如果想要查看計(jì)劃任務(wù)中的具體內(nèi)容,就必須查看 at spool 。只有 root 用戶(hù)才能查看at spool,因此你必須使用 sudo 來(lái)查看 spool 或 cat 任務(wù)的內(nèi)容。
小結(jié)
at 命令是避免忘記在將來(lái)特定時(shí)間的任務(wù)或在你離開(kāi)時(shí)讓計(jì)算機(jī)為你運(yùn)行任務(wù)的非常好的方式。與 cron 命令不一樣的是,它不需要使任務(wù)從現(xiàn)在一直循環(huán)運(yùn)行,因此它的語(yǔ)法比 cron 簡(jiǎn)單得多。
下次你想在下班后讓系統(tǒng)為你做個(gè)工作,可以試試 at 命令。
本文轉(zhuǎn)載自微信公眾號(hào)「良許Linux」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系良許Linux公眾號(hào)。