緯育 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 目錄下,以使用者帳號命名。
- 系統循環排程:由系統(通常是 root)執行。
- 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。
- 這樣即使主機在週末自動開機,也會在幾分鐘後被排程任務自動關閉。