1. 程式人生 > >/etc/cron.d 攻略

/etc/cron.d 攻略

com ont 統一管理 day ntpd code pre 直接 wro

這同樣是原本寫在 gists 中的古老文章。整一個可直接閱讀的版本。

為什麽不用 crontab ?

crontab 是日常使用最為頻繁地定時器工具。它將每個用戶的所有定時任務統一記錄、統一管理。

但對於項目系統中的定時任務而言,不同的定時任務可能需要交由不同的系統帳號執行。但如此,管理又很容易出現疏漏,比較尷尬。特別是當項目地不同時期由不同人員負責時,出現疏漏地概率會變得更高。

這種情況下,將所有定時任務以文件方式統一管理地 /etc/cron.d 似乎就更被我們所親睞。

/etc/cron.d 怎麽玩?

crontab 的定時任務格式是:

# MIN HOUR DAY MON WEEK CMD
*/15 * * * * /usr/sbin/ntpdate time.nist.gov > /dev/null 2>&1

/etc/cron.d 的任務文件格式與之基本相似,唯獨多了 USER 一項:

# MIN HOUR DAY MON WEEK USER CMD
*/15 * * * * root /usr/sbin/ntpdate time.nist.gov > /dev/null 2>&1

將上述內容保存至 /etc/cron.d 目錄中的 ntpdate.job 文件,就搞定了。

我們可以這樣的等價指令來理解 /etc/cron.d 的定時任務是如何被執行地:

‘sudo‘ -u <USER> -H <CMD>

檢查是否被執行

查看 /var/log/cron 日誌,如找到下面地記錄,就說明執行成功了。

Jul 17 17:01:01 centos crond[21350]: (root) CMD (/usr/sbin/ntpdate time.nist.gov > /dev/null 2>&1)

統一管理項目定時任務

$ sudo -s
# cd /etc/cron.d
# ls -1 project.*.job
project.update-foo.job@
project.remove-bar.job@
project.sync-blah.job@

WRONG FILE OWNER

但有時候,我們會從 /var/log/cron 日誌中找到這樣地記錄:

Jul 17 16:51:01 centos crond[1885]: (*system*) WRONG FILE OWNER (/etc/cron.d/project.update-foo.job)

這是因為 project.update-foo.job 這個任務文件的權限不是 root:root。這也是為什麽上文中會使用 sudo 作為等價指令地緣由。

命名要求

還有時候(今天),我們會無法從日誌中看到新配置地任務記錄。追查 man cron 之後才發現——

除了權限問題之外, /etc/cron.d 文件夾中的任務文件命名有特殊要求,只能使用 [\w\-] 字符,不能有 .

crontab + /etc/cron.d

回到最初的問題,我們需要思路上理清什麽時候該用 crontab ?什麽時候又該用 /etc/cron.d 呢?

最原始、最粗糙地識別方法——基於執行帳號判斷

如果執行帳號是系統帳號,那麽就 /etc/cron.d ;如果執行帳號是非系統帳號,那麽就 crontab 。

這種方法在大多數情況下,都是行之有效地。簡單、粗暴、實用。

/etc/cron.d 攻略