Anacron (排程工具)

Gandi Simple Hosting 沒有支援原生的 Unix/Linux 排程工具 Cron。但是,有支援另一個強大的排程工具:anacron

概念

概念上很簡單:您可以決定要定期執行什麼樣的指令或是任務 (工作),並且設定間隔時間。在設定檔中建立項目並且定義任務與週期,程式就會週期性的執行此任務。

每一個任務都有自己的時間週期。

備註

我們修改了 anacron 的標準板,可以讓間隔的時間更短,好讓您在操作上更有彈性。現在最小的間隔時間為 1 小時。

警告

Cron (與 anacron) 會佔用程序。這表示若您的主機規格是 S ,同時只能執行 2 個程序,Cron 將會佔用一個程序。如果同時有太多 Cron 程序在運作,或是其他任何程序同時運作,可能會造成主機被鎖住。如果您有大量的週期性作業需要執行,請考慮升級至規格 M 等級或以上的主機。

設定

要設定 anacron,您需要修改 anacrontab 檔。每一個 Simple Hosting 主機只有一個 anacrontab 。請透過 SFTP 或是緊急終端機存取:

SFTP 路徑:/lamp0/etc/cron/anacrontab

緊急終端機路徑:/srv/data/etc/cron/anacrontab

透過 SFTP 下載檔案,就像您從主機上下載其他檔案一樣。您可以在本機端編輯此檔案,完成之後上傳回主機。系統會自動執行新的設定。

備註

請使用一般的文字編輯器 (例如記事本) 來編輯此檔!不要使用 Word 之類的軟體!使用 # 開頭的行將被視為註解,多寫註解是好事!

決定執行週期

您可以使用兩個參數來設定執行週期:基本頻率與倍數。

基本頻率有 (由小至大):

  • hourly (每小時)
  • Daily (每天)
  • Monthly (每月)
  • Yearly (每年)

要設定作業的週期,只需要將 基本頻率乘以倍數

例如,您想要每兩個小時執行一次作業,請設定:2@hourly,如果您要每天備份一次資料庫,您可以有多種設定方式: 24@hourly 表示 24 個小時執行一次或是 1@daily (或是 @daily,不指定預設為 1 倍數) 表示每天執行一次。

語法

現在您知道如何設定時間,接下來是語法,有四個部件:

  • 週期
  • 逾時
  • 唯一名稱
  • 行動

我們版本的 anacron 無法設定逾時,所以此參數會被忽略。但是為了語法兼容性,請保持此值,請將之設定為 0 即可。名稱可以自訂,但是必須是唯一名稱。作業的設定就像輸入命令一樣,或是您可以編寫腳本。

在我們的範例中,我們將示範如何每日執行清除 /src/data/tmp 中 7 天以上的舊檔案:

@daily 0 purgetmp find /src/data/tmp -type f -mtime +7 -delete >> /dev/null

@daily 表示這個動作每天執行一次 (也可以設定 1@daily)。 0 是系統會忽略的逾時值。purgettmp 是此作業的唯一名稱。find /src/data/tmp -type f -mtime 7 -delete >> /dev/null 是用來刪除舊檔案的指令。

使用範例

匯出一個 MySQL 資料庫

如果您使用快照來備份主機的資料,但是 MySQL 的資料庫無法在損壞時使用快照的方式復原。

要執行資料庫備份,您必須透過 mysqldump 指令。要備份出最新的資料庫,您需要使用 anacron 來定期備份資料庫。您可以將此範例加入您主機的設定中 (您可能需要做適量的變更來符合您的需求):

@daily 0 mysql_backup mkdir -p /srv/data/tmp/mysql_backup ; mysqldump -u root {-pPASSWORD} --all-databases | /bin/gzip -9 > /srv/data/tmp/mysql_backup/`date '+%F'`.databases.sql.gz ; rm -f /srv/data/tmp/mysql_backup/`date '+%F' --date '1 week ago'`.databases.sql.gz

上述的範例將會每天匯出資料庫檔案,並且保留一週的時間。

小訣竅

如果您的 「root」 沒有密碼,則需要將 {-pPASSWORD} 刪除,若有密碼,則去除 {} 後在 -p 後方輸入密碼。

小訣竅

您可以利用終端機的方式執行指令,來確認是否有效。

匯出 PostgreSQL 資料庫

與 MySQL 的方式很像,使用 pg_dumpall 指令來匯出主機上的 postgresql 資料庫。

@daily 0 psql_backup mkdir -p /srv/data/tmp/psql_backup ;  pg_dumpall --username=hosting-db -h localhost > /srv/data/tmp/psql_backup/`date '+%F'`.databases ; rm -f /srv/data/tmp/psql_backup/`date '+%F' --date '1 week ago'`.databases

清空日誌檔

您可以利用 anacron 清空主機上的日誌檔,下方示範了如何清空 access.log 檔。

@daily 0 purge_apache_logs echo "***** Log cleaned at `date'+%F-%H%M'` *****" > /srv/data/var/log/apache/access.log

執行 PHP 命令稿

您也可以執行 PHP 命令稿,使用 php 命令並且指定參數 -f ,指定要執行的命令稿即可。

您的命令稿需要存放在同樣的路徑 (/srv/data/web/vhosts),並接續 vhost 目錄中虛擬站台的路徑。

在下面的範例中,我們每天執行一次 cron.php,此命令稿存放在 www.example.com 的根目錄中。

@daily 0 my_php_script php -f /srv/data/web/vhosts/www.example.com/cron.php

常見問題

為什麼使用 anacron 而非 cron?

使用 Anacron 有一個好處,即使您的主機處於失效狀態 (硬碟額滿),當您的系統回復時,在失效狀態時的作業都會再次啟動,而 Cron 的話則會失效,因此您有可能會遺失一些備份作業。

我的 anacron 將於何時執行?

系統會每小時檢查一次,以確定是否有過期的作業或待執行的作業。確切的時間是依照主機上次開機的時間,加上一個亂數的延遲來確保分散單一主機上同時執行多個作業的負載。