at 與 batch:一次性任務的排程 文章首圖

at 與 batch:一次性任務的排程

at 與 batch:一次性任務的排程

在 Linux 系統管理中,cron 無疑是最常用的定時任務排程工具,適合處理重複性、週期性的工作。然而,當我們需要執行「僅發生一次」的任務,例如:「兩小時後備份資料庫」或「明天早上九點發送通知郵件」時,cron 的設定顯得過於繁瑣。此時,atbatch 這兩個指令便成為解決一次性排程需求的最佳夥伴。本文将深入解析這兩者的用法,並提供在 Ubuntu 22.04 與 Debian 12 環境下的實戰範例。

at:精確控制的一次性排程

at 指令允許使用者指定未來的某個時間點執行命令。與 cron 不同,at 任務執行完畢後即自動移除,不會留下殘留的排程記錄,非常適合臨時性的系統維護或資料處理工作。

基本安裝與服務啟動

在 Ubuntu 22.04 或 Debian 12 中,at 工具通常預設未安裝。首先,請確保系統已安裝 at 套件,並確認 atd 服務正在運行:

sudo apt update
sudo apt install at
sudo systemctl enable --now atd

語法與時間格式

at 的基本語法為 at [時間]。它支援多種時間格式,例如:

  • 明確時間14:30(下午兩點半)、tomorrow 10:00(明天上午十點)。
  • 相對時間now + 5 minutes(五分鐘後)、15:00 + 3 days(三天後的下午三點)。
  • 特殊關鍵字noon(中午)、midnight(午夜)、teatime(下午四點)。

實際操作範例

假設我們希望在明天上午九點執行一個簡單的日誌備份指令。我們可以透過標準輸入或直接指定指令來完成:

at 09:00 tomorrow
warning: commands will be executed using /bin/sh
at> cp /var/log/syslog /tmp/syslog_backup.log
at> <EOT>
job 1 at Mon Oct 23 09:00:00 2023

在上述範例中,輸入 at 後會進入互動式介面,提示符號為 at>。您可以輸入多行指令,最後按下 Ctrl+D(即 <EOT>)來結束輸入並提交任務。系統會回傳任務編號(job ID),您可以利用此編號來管理該任務。

管理 at 任務

執行後,您可以使用以下指令查看或刪除待處理的任務:

  • atqat -l:列出所有待執行的 at 任務。
  • atrm [job_id]:刪除指定的任務。
$ atq
1   Mon Oct 23 09:00:00 2023 a user

$ atrm 1

batch:利用系統空閒時間執行

at 不同,batch 指令並不指定具體的執行時間,而是等待系統負載降低(通常指平均負載低於 0.8)時自動執行。這對於 CPU 密集型的背景任務非常有用,可以避免在系統繁忙時影響其他使用者或服務。

使用方式

batch 的用法與 at 幾乎相同,只是它不接收時間參數:

batch
<commands...>
<EOT>

當系統負載下降時,batch 任務會自動被排程執行。值得注意的是,batch 任務的執行環境與 at 類似,但它的優先級通常較低,且只在系統空閒時才會觸發。

常見問題與注意事項

1. 環境變數遺失問題

atbatch 任務在執行時,會使用一個乾淨的環境,這意味著許多環境變數(如 PATHHOME)可能與當前終端不同。如果指令依賴特定路徑或變數,可能會失敗。

解決方案:在指令中明確指定絕對路徑,或在指令開頭手動匯入必要變數。

at now + 1 hour
at> export PATH=/usr/local/bin:/usr/bin:/bin
at> /usr/bin/my_script.sh
at> <EOT>

2. 郵件通知機制

預設情況下,at 任務執行後,其標準輸出(stdout)和標準錯誤(stderr)會透過系統郵件服務(如 mailsendmail)發送給任務擁有者。如果系統未配置郵件服務,任務輸出可能會丟失,導致難以除錯。

解決方案

  • 確認系統已安裝並啟動郵件服務。
  • 或者,在指令中將輸出重導向至檔案,以便事後檢視。
at now + 5 minutes
at> /usr/bin/ls /nonexistent_dir > /tmp/at_output.log 2>&1
at> <EOT>

小結

atbatch 是 Linux 系統管理中不可或缺的工具,特別適合處理非週期性、一次性或需等待系統空閒的任務。透過精確的時間指定或智能的負載感知,它們能靈活地滿足各種排程需求。然而,使用者需注意環境變數的設定與郵件通知的配置,以確保任務順利執行且可追蹤。掌握這些技巧,將能大幅提升 Linux 系統管理的效率與彈性。