Linux at命令詳解

良許發表於2021-11-04

大家好,我是良許。

生活中,我們有太多場景需要使用到鬧鐘,比如早上 7 點起床,下午 4 點開會,晚上 8 點購物,等等。

在 Linux 系統裡,我們同樣也有類似的需求。比如我們想在凌晨 1 點將檔案上傳伺服器,或者在晚上 10 點確認系統狀態,等等。

但我們不可能一直守在電腦前,畢竟我們也需要下班/睡覺,還要陪女朋友(new一個也行)。而且即使在上班期間,如果到點了還需要人工操作,未免效率太低了。

at 命令就是為這個需求而誕生的。使用 at 命令,你可以在特定時間自動完成你所設定的任務,也可以實現自動化,非常方便快捷!

安裝 at 命令

一般來講,大部分 Linux 發行版都已經安裝了 at 命令,不確定的話可以使用 at -V 命令檢視,如果有版本返回,說明就可以正常使用 at 命令。

$ at -V
at version 3.1.13

你可能還需要啟動 at 守護程式,稱為 atd 。 在大多數 Linux 系統上,你可以使用 systemctl 命令啟用 atd 服務並將它們設定為從現在開始自動啟動:

$ sudo systemctl enable --now atd

at 命令基本用法

  • 語法
at [選項] [日期時間]
  • 選項
-f:指定包含具體指令的任務檔案
-q:指定新任務的佇列名稱
-l:顯示待執行任務的列表
-d:刪除指定的待執行任務
-m:任務執行完成後向使用者傳送 E-mail
  • 引數
日期時間:指定任務執行的日期時間

使用 at 命令互動性安排任務

想想看,我們平時是怎麼使用鬧鐘這個工具的?首先我們點選鬧鐘軟體上的加號,然後再設定時間,再在備註裡輸入鬧鐘的目的。

使用 at 命令互動性安排任務也是一樣的道理。首先你輸入 at 命令,然後再跟上具體的時間。

回車之後就進入到互動性介面,你再具體輸入要做的事情(命令),最後以 <EOT> 結束輸入,任務就設定好了。

例如,你想在早上 11:20 的時候,在 at-test.txt 文件裡寫入 hello world 這句話,可以這樣互動性輸入:

$ 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 命令使用直觀和自然的時間格式。你不需要知道 24 小時制或將時間轉換為 UTC 格式。通常,可以直接使用我們生活中常用的單詞它就能理解,例如noon1:30 PM13:37等。

在 11:20 過後,你可以使用 cat 命令檢查一下 at-test.txt 檔案是否有內容寫入:

$ cat ~/at-test.txt
hello world

使用 at 命令安排任務

如果你不想使用互動的方式來給 at 命令安排任務,可以使用管道將 echoprintf 的值傳遞給 at 命令。

比如,我想從現在開始一分鐘後向 at-test.txt 檔案寫入 hello again 語句:

$ echo "echo 'hello again' >> ~/at-test.txt" | at now +1 minute

一分鐘後,驗證新命令是否已執行:

$ cat ~/at-test.txt
hello world
hello again

時間表示式

前面提到過,at 命令使用的是我們日常生活中所使用的時間格式,非常方便:

  • YYMMDDhhmm[.ss]
    (縮寫年、月、日、小時、分鐘[秒])
  • CCYYMMDDhhmm[.ss]
    (完整年、月、日、小時、分鐘和[秒])
  • now
  • midnight
  • noon
  • teatime`(下午4點)
  • AM
  • PM

時間和日期可以是絕對的,也可以新增一個加號 ( + ) 使它們相對於現在。在指定相對時間時,下面這些日常生活中所使用的詞彙都可以使用:

  • minutes
  • hours
  • days
  • weeks
  • months
  • years

下面是一些 at 命令有效表示式的示例:

$ 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 任務佇列

隨時時間的推移,我們可以忘記在 at 命令佇列時設定了多少個任務,如果你想進行檢視,可以使用 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

要從佇列中刪除任務,請使用 atrm 命令和任務編號。例如要刪除任務 7 :

$ atrm 7
$ atq
10 Thu Jul 29 12:19:00 2021 a tux
9  Tue Jul 27 03:30:00 2021 a tux

如果想要檢視計劃任務中的具體內容,就必須檢視 at spool 。只有 root 使用者才能檢視at spool,因此你必須使用 sudo 來檢視 spoolcat 任務的內容。

小結

at 命令是避免忘記在將來特定時間的任務或在你離開時讓計算機為你執行任務的非常好的方式。與 cron 命令不一樣的是,它不需要使任務從現在一直迴圈執行,因此它的語法比 cron 簡單得多。

下次你想在下班後讓系統為你做個工作,可以試試 at 命令。


最後,最近很多小夥伴找我要Linux學習路線圖,於是我根據自己的經驗,利用業餘時間熬夜肝了一個月,整理了一份電子書。無論你是面試還是自我提升,相信都會對你有幫助!

免費送給大家,只求大家金指給我點個贊!

電子書 | Linux開發學習路線圖

也希望有小夥伴能加入我,把這份電子書做得更完美!

有收穫?希望老鐵們來個三連擊,給更多的人看到這篇文章

推薦閱讀: