Linux中國

使用 cron 定時任務的小技巧

在計算機上讓任務按照有規律並且可預測的時間表運行很重要。作為人類,我們有時會因為分心、腦子裡想太多,或是度假而記不住要做的事情。計算機真的很擅長按計劃做事,但在計算機採取行動之前,人類必須對計算機進行編程。

在某種程度上,cron 系統是編程的初級簡單入門。通過編輯一個文件就可以讓計算機做你想讓它做的事。你甚至不需要知道文件保存在哪裡。只需鍵入一個簡單的命令,輸入你希望電腦遵循的 「配方」,並保存。從那時起,計算機會在指定時間執行你的指令,直到被告知停止。

從設計上來看,cron 不是一個複雜的系統。這裡有一些你需要了解的內容。

cron 是什麼?

cron 命令在 Linux 和 Unix 中無處不在,而且它經常被模仿和重塑,以至於它幾乎成了按計劃發生的事情的一個通用術語。它是自動化的一種形式,儘管有不同的實現方式(比如 Dillon's cron、Vixie's cron、chrony 和其他),以及像 anacron 和 systemd 定時器這樣的變化,但其語法和工作流程幾十年來一直保持著基本一致。

cron 在一個 「 假離線 spool 」 系統上工作,像印表機和電子郵件一樣。如果不你知道印表機和電子郵件使用假離線也沒關係,因為假離線文件的意義在於,你不需要想太多。在 Linux 系統中,/var/spool 目錄被設計為重要但低級的文件的中心樞紐,用戶不需要直接與之交互。 在 /var/spool 中管理的一個假離線是 cron 表(簡稱為 「crontab」)。 包括你在內的每個用戶在 Linux 系統中都有一個 crontab。用戶可以編輯、查看和刪除自己的 crontab。除此之外,用戶可以使用 crontab 來安排任務。cron 系統監控 crontab,並確保一個 crontab 中列出的任何工作都能在其指定時間執行。

編輯 cron 設置

你可以使用 crontab 命令和 -e(代表「編輯」)選項來編輯你的 crontab。默認情況下,大多數系統會調用 vim 文本編輯器。如果你和我一樣,不使用 Vim,那麼你可以在 ~/.bashrc 文件中為自己設置一個不同的編輯器。我把我的設置為 Emacs,但你也可以試試 NanoKate,或者任何你喜歡的編輯器。EDITOR 環境變數定義了你在終端使用的文本編輯器,而 VISUAL 變數定義了你在圖形模式下使用的編輯器:

export EDITOR=nano
export VISUAL=kate

更新設置後刷新你的 shell 會話:

$ source ~/.bashrc

現在你可以用喜歡的編輯器編輯 crontab:

$ crontab -e

為任務執行安排時間

cron 系統本質上是一個日曆系統。可以通過五個不同的屬性告訴 cron 需要讓一個任務多長時間運行一次:分、時、日、月、星期。這些屬性的順序是固定的,並且不一定是直觀的,你可以把它們看作是過濾器或掩碼。默認情況下,你可以理解為所有東西都被設置為「總是」或者「每一個」。此命令將在全年的每一天每小時每分鐘運行 touch /tmp/hello

* * * * * touch /tmp/hello

可以通過設置每個屬性的具體定義來限制這個包羅萬象的時間安排表。使任務在每個小時的 30 分鐘時運行,將分鐘設置為 30

30 * * * * touch /tmp/hello

可以通過一個具體的小時來進一步約束這個指令。使任務在每個凌晨 3:30 運行:

30 3 * * * touch /tmp/hello

你也可以讓這個任務只在每個月的第一天運行:

30 3 1 * * touch /tmp/hello

你可以用 112 表示 1 至 12 月來設置月份,用 06 表示周日至周六來設置星期。這項任務在 4 月份的周一的 3:15 運行:

15 3 * 4 1 touch /tmp/hello

設置增量

所有這些設置都與一個固定時間 完全 匹配。使用 cron 符號設置可以在特定時間段後運行任務,例如,每 15 分鐘運行一個任務:

*/15 * * * * touch /tmp/hello

每三天在上午 10 點運行任務:

* 10 */3 * * touch /tmp/hello

每 6 小時運行一次任務:

* */6 * * * touch /tmp/hello

Cron 速記符

現代的 cron 實現已經為常見的時間安排表添加了方便的速記符,包括:

  • @hourly:每小時
  • @daily:每天
  • @weekly:每周
  • @monthly:每月
  • @yearly@annually:每年

列出 cron 任務

使用 crontab 命令,查看計劃中的 cron 任務列表:

$ crontab -l
15 3 * 4 1 touch /tmp/hello

刪除一個 crontab

當一個 crontab 任務不需要時,可以使用 -r 選項來刪除它:

$ crontab -r -i

-i 選項代表 互動式。它在刪除文件之前會提示你進行確認。

Cron 可以做什麼

知道如何使用 cron 是一回事,但但知道它的用途是另一回事。經典用例就是備份計劃。如果你的電腦一天中大部分時間都是開著的,或者整天整夜地開著,那麼可以為重要分區進行例行備份。我會在每天凌晨 3 點在主要數據分區上運行一個名為 rdiff-backup 的備份程序:

$ crontab -l | grep rdiff
* 3 * * * rdiff-backup /data/ /vault/

另一個常見的用途是系統維護。在我的 Slackware 桌面上,每周五下午會更新本地版本庫目錄:

$ crontab -l | grep slack
* 14 * * 5 sudo slackpkg update

我還會每 3 天在 15:00 運行一個 Ansible 腳本來 清理我的下載文件夾

$ crontab -l | grep ansible
* 15 */3 * * ansible-playbook /home/seth/Ansible/cleanup.yaml

有一些重複數據刪除腳本、文件大小和 /tmp 目錄的監視器、照片調整器、文件移動工具以及很多瑣碎的任務,你可以安排在後台運行,以幫助保持系統不受干擾。有了 cron,計算機可以以我希望我的實體公寓能夠做到的方式來照顧自己。

記住 cron 的設置

除了想明白你為什麼需要 cron 之外,根據我的經驗,cron 最難的事情是記住它的語法。重複這句話給自己聽,反反覆復,直到你記牢它:

分、時、日、月、星

分、時、日、月、星

分、時、日、月、星

更好的做法是,去 下載我們免費的速查表 ,這樣當你最需要它時,它觸手可及!

Cron 速查表

via: https://opensource.com/article/21/11/cron-linux

作者:Seth Kenlon 選題:lujun9972 譯者:Veryzzj 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國