緯育 2026-0513

出自頂極製作所

本次講座主要介紹 Linux 系統中的排程(Scheduling)功能,將排程分為「單次排程」(at)與「循環排程」(cron)兩大類進行說明。講師首先強調,在實際工作場景中,循環排程因其重複執行的特性而更為常用與重要,特別是系統層級的循環排程。講座詳細介紹了排程的應用情境,例如半夜關機維修、定時清除暫存檔、備份資料庫等,並說明了作業系統如何利用排程執行內建功能,如日誌檔案整理(Logrotate)與資料庫更新。

接著,講座深入探討單次排程 at,包括其定義、特性、相關服務(atd)、在不同發行版中的安裝與啟動,以及如何透過 at.allow 和 at.deny 檔案進行權限管理。講師透過實作練習,詳細展示了 at 指令集(at, atq, atrm, at -c)的使用方法,包括建立、查詢、修改及刪除任務。

後半部分則轉向介紹循環排程 cron,說明其服務 crond 與相似的權限設定檔 cron.allow 和 cron.deny。講師詳細講解了系統級與個人級循環排程的區別、設定檔案的位置(/etc/crontab, /etc/cron.d/, /var/spool/cron),並深入剖析 crontab 的時間欄位格式(分、時、日、月、週)及其特殊符號(, ,, -, /)的應用。最後,透過具體範例指導如何設定系統與個人排程任務,並探討了伺服器遠端開機(如 Wake-on-LAN)與自動化管理的進階策略。

排程基礎概念與分類

  • 排程的定義與用途
    • 排程是將工作預先安排好,交給作業系統,讓系統在指定時間自動執行的機制。
    • 應用情境範例:
      • 半夜關機維修:可預先設定關機指令,而無需人員等到半夜三點執行。
      • 定時傳送程式執行結果:例如設定下午三點將程式結果寄到指定信箱。
      • 每日定時清除暫存檔:例如清除 /tmp 目錄下的檔案。
      • 每週固定時間備份資料庫。
  • 作業系統中的排程應用實例
    • 日誌檔案的整理與置換 (Logrotate):系統透過排程在特定時間自動執行 Logrotate。
    • Locate 指令的資料庫更新:Locate 指令的資料庫會透過排程自動更新。
    • MAN page 資料更新:MAN page 資料庫的更新可寫入排程。
    • 系統更新指令自動化:可將 apt update 這類指令加入排程,使其每日自動在背景執行。
  • 排程的兩大類型
    • 單次排程 (at):工作僅執行一次,執行完畢後即結束,不會再重複。
    • 循環排程 (cron):在指定的時間週期(分、時、日、月、週)重複執行工作,是實務上更常用的一種。

單次排程 (at)

  • 特性與服務 (ATD)
    • 一次性的工作執行,執行完畢後即失效。
    • 依賴一個名為 atd 的背景服務來運作。若服務未啟動,排程不會執行。
    • Ubuntu 22.04 以後版本預設不安裝,需手動安裝 (apt install at);CentOS 通常預設安裝但需手動啟動。
    • 服務管理指令:systemctl status atd、systemctl start atd、systemctl enable atd。
    • 排程檔案儲存位置:Ubuntu 中為 /var/spool/cron/atjobs。
  • 權限管理
    • 透過 /etc/at.allow 和 /etc/at.deny 兩個檔案來控制使用者權限。
    • 權限判斷邏輯:
   1. root 帳號永遠擁有使用權限。
   2. 若 /etc/at.allow 存在,則只有列在該檔案中的使用者被允許,此時 /etc/at.deny 被忽略。
   3. 若 /etc/at.allow 不存在,但 /etc/at.deny 存在,則未被列在 /etc/at.deny 中的使用者皆可使用。
   4. 若兩個檔案都不存在,則只有 root 能使用。
  • at 指令集與用法
    • 建立排程:at [時間],進入互動模式後輸入指令,按 Ctrl+D 結束。
    • 查看排程列表:at -l 或 atq。
    • 查看排程內容:at -c [編號]。可直接編輯其對應的腳本檔來修改排程。
    • 刪除排程:at -d [編號] 或 atrm [編號]。
  • 時間格式
    • 特定時間:HH:MM (例如 20:00)。
    • 特定日期與時間:HH:MM YYYY-MM-DD (例如 20:00 2026-05-30)。
    • 相對時間:now + [數量] [單位] (例如 now + 30 minutes)。

循環排程 (cron)

  • 服務與權限
    • 循環排程依賴於 crond 服務,必須確保其正在運行且已設定開機啟動。
    • 權限控制與 at 類似,使用 /etc/cron.allow 和 /etc/cron.deny 檔案,判斷邏輯完全相同。
  • 排程類型與設定檔
    • 系統循環排程:由系統(通常是 root)執行。
      • 主要設定檔:/etc/crontab。
      • 格式:分 時 日 月 週 使用者帳號 指令。
      • 需使用 vi 等編輯器直接修改。
      • 輔助目錄:/etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly,可將腳本直接放入對應目錄,系統會按時執行。
    • 個人循環排程:以特定使用者帳號身份執行。
      • 使用 crontab -e 進行編輯。
      • 格式:分 時 日 月 週 指令(無使用者帳號欄位)。
      • 使用 crontab -l 查看排程。
      • 排程檔案儲存在 /var/spool/cron 目錄下,以使用者帳號命名。
  • crontab 時間格式詳解
    • 五個時間欄位:
   1. 分 (Minute): 0 * 59
   2. 時 (Hour): 0 * 23
   3. 日 (Day of month): 1 * 31
   4. 月 (Month): 1 * 12
   5. 週 (Day of week): 0 * 7 ( 0 和 7 皆為星期日)
    • 特殊符號:
      • 星號 ()*: 代表「每一個」單位。例如 表示每分鐘。
      • 逗號 (,): 用於指定不連續的時段。例如 0 10,14 表示每天的 10:00 和 14:00。
      • 減號 (-): 用於指定連續的時間範圍。例如 0 8-12 1-5 表示週一至週五,早上 8 點到 12 點的每個整點。
      • 斜線 (/): 代表頻率。例如 /5 表示每隔 5 分鐘。

伺服器遠端開機與管理策略

  • 自動開機解決方案:
    • 主機板BIOS設定:設定每日在特定時間自動開機。
    • 網路卡開機 (Wake-on-LAN):在區域網路內發送特定封包(Magic Packet)來喚醒主機。
    • 電話卡喚醒 (Ring-on):較古老的技術,透過撥打電話喚醒主機。
  • 週末不開機策略:
    • 結合 BIOS 每日自動開機與 cron 排程。
    • 在 /etc/crontab 中設定一條僅在週末執行的關機指令,例如:/5 6-7 root shutdown。
    • 這樣即使主機在週末自動開機,也會在幾分鐘後被排程任務自動關閉。

2026-0513-01.png