什么是cron? Linux系統(tǒng)下Cron定時(shí)任務(wù)使用指南

在管理 Linux 服務(wù)器的過(guò)程中,總有一些任務(wù)需要我們定期或重復(fù)執(zhí)行。就比如備份任務(wù),通常會(huì)選在服務(wù)器資源占用較少的時(shí)間段進(jìn)行,比如每天凌晨。好在,我們有兩個(gè)得力助手可以依賴(lài)——at
和cron
服務(wù):
at
服務(wù)適合用來(lái)安排一次性任務(wù),比如在某個(gè)特定的時(shí)間運(yùn)行一次。- 而
cron
服務(wù)則專(zhuān)門(mén)用來(lái)處理重復(fù)性任務(wù),比如每天、每周甚至每月執(zhí)行的任務(wù)。
接下來(lái),本文將詳細(xì)介紹cron
服務(wù)的用法,以及如何利用它來(lái)高效管理定時(shí)任務(wù)。
什么是 cron?
cron 是 Linux/Unix 系統(tǒng)中用于計(jì)劃任務(wù)的守護(hù)進(jìn)程。它允許用戶(hù)在指定時(shí)間自動(dòng)執(zhí)行命令或腳本,而無(wú)需手動(dòng)干預(yù)。cron 可以用于計(jì)劃執(zhí)行重復(fù)性任務(wù),例如每天、每周、每月甚至每小時(shí)執(zhí)行的任務(wù)。
cron 和 crontab
cron:是 Linux 系統(tǒng)中負(fù)責(zé)執(zhí)行定時(shí)任務(wù)的服務(wù)。
crontab:是一個(gè)命令,用于創(chuàng)建、刪除和管理定時(shí)任務(wù)。每個(gè)用戶(hù)都可以擁有自己的 crontab 文件,來(lái)定義屬于自己用戶(hù)的任務(wù)計(jì)劃。系統(tǒng)管理員還可以配置全局 crontab 文件,用于整個(gè)系統(tǒng)級(jí)別的任務(wù)調(diào)度。
cron 的優(yōu)勢(shì)
- 自動(dòng)化:定時(shí)執(zhí)行任務(wù),減少手工操作。
- 靈活:支持各種時(shí)間設(shè)置,可以精確到分鐘,支持多種任務(wù)頻率。
- 穩(wěn)定:cron 是非常穩(wěn)定的守護(hù)進(jìn)程,一旦設(shè)置正確,它幾乎不會(huì)出現(xiàn)問(wèn)題。
Cron 的主要用途
cron 是一個(gè)在類(lèi) Unix 操作系統(tǒng)中使用的「作業(yè)調(diào)度器」,它能夠幫助我們定期自動(dòng)執(zhí)行任務(wù)。這些任務(wù)可以是命令或 Shell 腳本,通常被稱(chēng)為「cron 作業(yè)」。它的主要功能和用途包括:
自動(dòng)化系統(tǒng)維護(hù):常用于自動(dòng)化系統(tǒng)維護(hù)或管理任務(wù),比如備份、日志輪轉(zhuǎn)等。舉個(gè)來(lái)說(shuō),「」就使用了 cron 在每天凌晨 3 點(diǎn)進(jìn)行網(wǎng)站備份,每 3 小時(shí)進(jìn)行一次數(shù)據(jù)庫(kù)備份。執(zhí)行重復(fù)性任務(wù):尤其適合安排重復(fù)性任務(wù),比如每天、每周或每月執(zhí)行的任務(wù)。例如,你可以設(shè)置一個(gè) cron 作業(yè),每周一早上 8 點(diǎn)自動(dòng)清理臨時(shí)文件。在特定時(shí)間執(zhí)行任務(wù):允許用戶(hù)在固定的時(shí)間、日期或間隔執(zhí)行任務(wù)。比如,你可以設(shè)置一個(gè) cron 作業(yè),每周四下午 3 點(diǎn)運(yùn)行特定的腳本。自動(dòng)化應(yīng)用程序任務(wù):許多系統(tǒng)進(jìn)程和服務(wù),比如 logwatch 和 logrotate,都依賴(lài) cron 來(lái)安排任務(wù)并自動(dòng)運(yùn)行。例如,通過(guò) cron 對(duì) nginx 日志進(jìn)行輪轉(zhuǎn),確保日志文件不會(huì)占用過(guò)多磁盤(pán)空間。文件下載:除了系統(tǒng)管理,cron 的通用性讓它也可以用于其他任務(wù),比如定期從互聯(lián)網(wǎng)下載文件等。
總之,cron 的靈活性讓它成為了系統(tǒng)管理時(shí)不可或缺的一個(gè)工具,無(wú)論是日常任務(wù)還是特殊需求,它都能輕松拿捏!
- 自動(dòng)化系統(tǒng)維護(hù):常用于自動(dòng)化系統(tǒng)維護(hù)或管理任務(wù),比如備份、日志輪轉(zhuǎn)等。舉個(gè)來(lái)說(shuō),「系統(tǒng)極客」就使用了 cron 在每天凌晨 3 點(diǎn)進(jìn)行網(wǎng)站備份,每 3 小時(shí)進(jìn)行一次數(shù)據(jù)庫(kù)備份。
- 執(zhí)行重復(fù)性任務(wù):尤其適合安排重復(fù)性任務(wù),比如每天、每周或每月執(zhí)行的任務(wù)。例如,你可以設(shè)置一個(gè) cron 作業(yè),每周一早上 8 點(diǎn)自動(dòng)清理臨時(shí)文件。
- 在特定時(shí)間執(zhí)行任務(wù):允許用戶(hù)在固定的時(shí)間、日期或間隔執(zhí)行任務(wù)。比如,你可以設(shè)置一個(gè) cron 作業(yè),每周四下午 3 點(diǎn)運(yùn)行特定的腳本。
- 自動(dòng)化應(yīng)用程序任務(wù):許多系統(tǒng)進(jìn)程和服務(wù),比如 logwatch 和 logrotate,都依賴(lài) cron 來(lái)安排任務(wù)并自動(dòng)運(yùn)行。例如,通過(guò) cron 對(duì) nginx 日志進(jìn)行輪轉(zhuǎn),確保日志文件不會(huì)占用過(guò)多磁盤(pán)空間。
- 文件下載:除了系統(tǒng)管理,cron 的通用性讓它也可以用于其他任務(wù),比如定期從互聯(lián)網(wǎng)下載文件等。
總之,cron 的靈活性讓它成為了系統(tǒng)管理時(shí)不可或缺的一個(gè)工具,無(wú)論是日常任務(wù)還是特殊需求,它都能輕松拿捏!
Cron 的工作機(jī)制
- Cron 的核心驅(qū)動(dòng):Cron 的行為由
crontab
文件進(jìn)行控制,這個(gè)文件定義了在特定時(shí)間表上要定期執(zhí)行的命令。 - 后臺(tái)服務(wù)支持:Cron 的運(yùn)作依賴(lài)于
crond
這個(gè)守護(hù)進(jìn)程。crond
會(huì)定期掃描以下目錄和文件:/var/spool/cron/
:存儲(chǔ)每個(gè)用戶(hù)(包括 root 用戶(hù))的crontab
文件。/etc/cron.d/
:存儲(chǔ)系統(tǒng)服務(wù)和應(yīng)用程序添加的 cron 作業(yè)文件。
- 編輯 Cron 文件:你可以通過(guò)執(zhí)行
crontab -e
命令來(lái)編輯你的 cron 文件。當(dāng)你保存并退出編輯器時(shí),crond
守護(hù)進(jìn)程會(huì)自動(dòng)重新加載,確保新的配置立即生效。
如何使用 Crontab
cron
的運(yùn)行依賴(lài)于 crontab(cron 表)中定義的「時(shí)間表達(dá)式」。每個(gè)用戶(hù),包括 root 用戶(hù),都可以擁有自己的 cron 文件。- 默認(rèn)情況下,crontab 文件并不存在,你可以通過(guò)執(zhí)行
crontab -e
命令來(lái)創(chuàng)建或編輯它。 - 首次使用
crontab -e
命令時(shí),系統(tǒng)會(huì)提示你選擇文本編輯器,比如 nano、vim 等。你也可以隨時(shí)通過(guò)select-editor
命令來(lái)更換默認(rèn)編輯器。 - 使用
crontab -e
命令不僅方便編輯,而且會(huì)在保存后自動(dòng)重載crond
守護(hù)進(jìn)程,確保新的配置立即生效。
因此,強(qiáng)烈建議不要使用傳統(tǒng)編輯器(如 vi、vim、emacs、nano 等)直接修改 crontab 文件。
說(shuō)了這么多,其實(shí)主要步驟就兩個(gè):
- 準(zhǔn)備好要執(zhí)行的命令或 Shell 腳本:確保你的命令或腳本能夠正常運(yùn)行。
- 設(shè)定執(zhí)行的時(shí)間或周期:通過(guò)「crontab 表達(dá)式」來(lái)定義任務(wù)的執(zhí)行時(shí)間。
其中,最關(guān)鍵的還是「crontab 表達(dá)式」的寫(xiě)法。接下來(lái),我將詳細(xì)講解如何編寫(xiě),幫助你輕松搞定定時(shí)任務(wù)!
Crontab 表達(dá)式速查
# crontab -e SHELL=/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin # 示例任務(wù)定義: # .---------------- 分鐘 (0 - 59) # | .------------- 小時(shí) (0 - 23) # | | .---------- 日期 (1 - 31) # | | | .------- 月份 (1 - 12) 或 jan,feb,mar,apr ... # | | | | .---- 星期幾 (0 - 6) (周日=0 或 7) 或 sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * 用戶(hù)名 執(zhí)行的命令 ## 示例任務(wù): 0 3 * * * /bin/bash /usr/local/src/wehost-full-backup.sh 0 */3 * * * /bin/bash /usr/local/src/mysql-full-backup.sh
小貼士
由于cron
默認(rèn)不會(huì)提供任何環(huán)境變量,最上面的前 2 行代碼幫助我們?cè)O(shè)置了默認(rèn)的運(yùn)行環(huán)境。你可以根據(jù)實(shí)際需要自行配置(也可以不寫(xiě)):
- SHELL:指定運(yùn)行命令時(shí)使用的 shell,我這里選擇了 Bash。
- PATH:定義環(huán)境的執(zhí)行路徑。
為了避免不必要的錯(cuò)誤,我還是傾向于為每個(gè)可執(zhí)行文件明確添加完整路徑。
示例任務(wù)
使用 crontab -e 命令打開(kāi)并編輯 cron 作業(yè)
- 每天凌晨 3 點(diǎn)執(zhí)行備份腳本:
0 3 * * * /bin/bash /usr/local/src/wehost-full-backup.sh
- 每 3 小時(shí)執(zhí)行一次數(shù)據(jù)庫(kù)備份腳本:
0 */3 * * * /bin/bash /usr/local/src/mysql-full-backup.sh
通過(guò)以上實(shí)例,你可以看到,只要根據(jù)實(shí)際需求來(lái)調(diào)整時(shí)間字段和命令路徑,就可以輕松設(shè)定你想要的定時(shí)任務(wù)。
說(shuō)個(gè)題外話(huà):「」的數(shù)據(jù)會(huì)按上面的腳本來(lái)備份網(wǎng)站和數(shù)據(jù)庫(kù),并會(huì)在備份數(shù)據(jù)庫(kù)的同時(shí),通過(guò) rclone 同步到騰訊的 COS。然后再通過(guò) GitHub Actions 調(diào)用 rclone 每 7 天同步到 Cloudflare R2。這是生害怕騰訊刪庫(kù)跑路了呀……
配置時(shí)間字段
通過(guò)合理配置 crontab 表達(dá)式和環(huán)境變量,你就可以輕松管理定時(shí)任務(wù),確保系統(tǒng)高效運(yùn)行。至于那個(gè)看起來(lái)有點(diǎn)復(fù)雜的* * * * *
,它們分別代表分鐘、小時(shí)、日期、月份、星期幾。不過(guò),別擔(dān)心,咱也不用死記硬背:
- 以前,大家都喜歡用一些在線的「crontab 執(zhí)行時(shí)間計(jì)算」工具來(lái)快速查詢(xún)并輔助填寫(xiě)。
- 現(xiàn)在嘛,直接找 AI 幫忙就完事了!比如找 ChatGPT、DeepSeek,只要說(shuō)出你的需求,AI 就能幫你生成對(duì)應(yīng)的表達(dá)式。舉個(gè)例子,你可以直接問(wèn):「我想每天凌晨 2 點(diǎn)運(yùn)行一個(gè)腳本,crontab 表達(dá)式怎么寫(xiě)?」是不是方便多了?
利用 AI 輔助生成 crontab 表達(dá)式
使用快捷方式
在crontab
文件中,我們可以使用一些「單詞快捷方式」來(lái)替代傳統(tǒng)的時(shí)間字段寫(xiě)法。這些快捷方式用@
字符進(jìn)行表示,能夠極大地簡(jiǎn)化時(shí)間控制的配置。例如:
快捷方式 | 運(yùn)行頻率 | 對(duì)應(yīng)的傳統(tǒng)表達(dá)式 |
---|---|---|
@reboot | 每次系統(tǒng)重啟后運(yùn)行一次 | / |
@yearly | 每年運(yùn)行一次 | 0 0 1 1 * |
@annually | 每年運(yùn)行一次 | 0 0 1 1 * |
@monthly | 每月運(yùn)行一次 | 0 0 1 * * |
@weekly | 每周運(yùn)行一次 | 0 0 * * 0 |
@daily | 每天運(yùn)行一次 | 0 0 * * * |
@hourly | 每小時(shí)運(yùn)行一次 | 0 * * * * |
這些快捷方式不僅適用于用戶(hù)的 crontab 文件,也可以用于/etc/cron.d
目錄下的系統(tǒng)級(jí) crontab 文件。這樣不僅讓任務(wù)配置更加簡(jiǎn)潔易讀,同時(shí)也減少了出錯(cuò)的可能性。
例如,如果你想要每天運(yùn)行一次備份腳本,可以寫(xiě)成以下配置,不需要手動(dòng)指定時(shí)間字段:
@daily /bin/bash /usr/local/src/backup.sh
cron.d 目錄的作用
/etc/cron.d
目錄是一個(gè)專(zhuān)門(mén)用來(lái)存放應(yīng)用程序和系統(tǒng)級(jí) cron 文件的地方。一些常見(jiàn)的應(yīng)用,比如 SpamAssassin 和 sysstat,會(huì)將它們的定時(shí)任務(wù)文件存放在這個(gè)目錄下。
由于這些程序通常沒(méi)有獨(dú)立的用戶(hù)賬戶(hù)(如spamassassin
或sysstat
用戶(hù)),它們就需要一個(gè)共享的目錄來(lái)統(tǒng)一管理 cron 任務(wù)。因此,/etc/cron.d
就成了系統(tǒng)級(jí)定時(shí)任務(wù)的默認(rèn)位置。
舉個(gè)例子,騰訊云的「服務(wù)器安全監(jiān)控組件」的定時(shí)任務(wù)就定義在/etc/cron.d/yunjing
文件中。這個(gè)文件定義了兩個(gè)任務(wù):
- 每隔 30 分鐘執(zhí)行一次任務(wù)。
- 在系統(tǒng)啟動(dòng)后的 30 秒運(yùn)行任務(wù)。
*/30 * * * * root /usr/local/qcloud/YunJing/YDCrontab.sh > /dev/null 2>&1 @reboot root sleep 30 && /usr/local/qcloud/YunJing/YDCrontab.sh > /dev/null 2>&1
查看系統(tǒng)級(jí) cron 配置文件
限制 cron 的使用
雖然普通用戶(hù)也能使用 cron,但這可能會(huì)帶來(lái)一些潛在風(fēng)險(xiǎn)。比如,用戶(hù)的誤操作可能導(dǎo)致系統(tǒng)資源(如內(nèi)存和 CPU)被過(guò)度占用,進(jìn)而影響系統(tǒng)整體性能。為了避免這些問(wèn)題,我們可以采取以下措施:
- 權(quán)限限制:管理員可以通過(guò)創(chuàng)建
/etc/cron.allow
文件來(lái)限制用戶(hù)的 cron 權(quán)限。只有在這個(gè)文件中列出的用戶(hù)才能創(chuàng)建 cron 任務(wù)。
root
用戶(hù)始終擁有使用 cron 的權(quán)限,無(wú)法被限制。
- 指定運(yùn)行用戶(hù):在定義任務(wù)時(shí),可以通過(guò)「用戶(hù)名」字段指定任務(wù)運(yùn)行時(shí)的身份。例如,下面的命令會(huì)以
billyfu
這個(gè)用戶(hù)身份執(zhí)行腳本:
04 07 * * * billyfu /usr/local/bin/mycronjob.sh
- 默認(rèn)執(zhí)行身份:如果沒(méi)有明確指定用戶(hù),任務(wù)將以「crontab 文件的所屬用戶(hù)身份」運(yùn)行。比如,如果任務(wù)定義在 root 的 crontab 文件中,那么默認(rèn)會(huì)以 root 身份執(zhí)行。注意事項(xiàng)
需要注意的是,
crond
服務(wù)會(huì)假設(shè)定算機(jī)一直保持開(kāi)機(jī)狀態(tài)。如果系統(tǒng)在 cron 任務(wù)的計(jì)劃執(zhí)行時(shí)間段處于關(guān)機(jī)狀態(tài),那這些任務(wù)錯(cuò)過(guò)也就錯(cuò)過(guò)了,不會(huì)被「補(bǔ)執(zhí)行」,只會(huì)在下一次計(jì)劃時(shí)間再次運(yùn)行。
簡(jiǎn)單來(lái)說(shuō),如果任務(wù)應(yīng)該在電腦關(guān)機(jī)時(shí)執(zhí)行,cron 是不會(huì)補(bǔ)做的。它只會(huì)「按點(diǎn)辦事」,錯(cuò)過(guò)就只能等下次。
相關(guān)文章
如何查看已安裝的Linux內(nèi)核? 命令行查看所有已安裝Linux內(nèi)核的技巧
Linux系統(tǒng)安裝多個(gè)內(nèi)核版本,想要看看電腦到底安裝了多少個(gè)版本,該怎么查看呢?下面我們就來(lái)看看詳細(xì)教程2024-12-13linux查看系統(tǒng)版本和內(nèi)核? Linux內(nèi)核和操作系統(tǒng)版本查詢(xún)方法
在 Linux 操作系統(tǒng)的日常管理中,了解系統(tǒng)版本和內(nèi)核信息是至關(guān)重要的,這不僅有助于確保軟件兼容性,還能幫助我們進(jìn)行故障排查和性能調(diào)優(yōu),本文將詳細(xì)介紹如何查看這些信2024-12-13linux哪個(gè)桌面好看? 8款最佳 Linux 桌面環(huán)境推薦
一款設(shè)計(jì)出色的桌面環(huán)境不僅能讓人眼前一亮,而且能讓使用變得輕松自如,為了讓你更好地選擇適合自己的桌面環(huán)境,本文精選了當(dāng)前最受歡迎的 8 大主流 Linux 桌面環(huán)境,詳細(xì)2024-11-21Linux版本怎么選? 2024十款最適合初學(xué)者的Linux發(fā)行版本推薦
本文將為大家推薦 10 款面向初學(xué)者的 Linux 發(fā)行版,今天我們就來(lái),幫助你在眾多好用的 Linux 系統(tǒng)中挑選出最適合自己的那一款2024-11-21如何選擇最合適自己的linux系統(tǒng)? 2024十款最佳桌面Linux發(fā)行版本推薦
Linux作為一個(gè)免費(fèi)且開(kāi)源的操作系統(tǒng),隨著時(shí)間的推移催生了多個(gè)發(fā)行版,并且得到了龐大的用戶(hù)社區(qū)的支持,如果你已經(jīng)在用了,并且正在尋找更好用的版本,那就請(qǐng)繼續(xù)看下去2024-11-21Linux的systemctl怎么用? systemctl命令一鍵搞定Linux服務(wù)管理的技巧
今天我們來(lái)看看如何使用systemctl命令來(lái)管理Linux系統(tǒng)中的服務(wù),包括啟動(dòng)、停止、重啟、配置加載、開(kāi)機(jī)啟動(dòng)設(shè)置以及查看服務(wù)狀態(tài)2024-10-21- 然 Ubuntu 提供了優(yōu)秀的圖形化軟件管理工具,我們絕大多數(shù)時(shí)間并不需要使用命令行來(lái)管理 Snap 軟件包,但命令行擁有更強(qiáng)的功能和靈活性,學(xué)會(huì)如何使用可以幫你更好地掌控系2024-10-18
Flatpak和Snapcraft怎么選? Linux軟件包管理系統(tǒng)優(yōu)缺點(diǎn)對(duì)比
Linux 軟件的打包和分發(fā)方式在過(guò)去幾年中也取得了長(zhǎng)足地進(jìn)展,本文將探討 Flatpak 和 Snapcraft 之間的關(guān)鍵差異,它們各自的優(yōu)/缺點(diǎn),以期望幫助用戶(hù)找到更適合自己的一款2024-10-18linux服務(wù)器重啟命令哪個(gè)好用? Linux服務(wù)器重啟命令匯總
在 Linux 系統(tǒng)中,最嚴(yán)謹(jǐn)?shù)闹貑⒚钍?shutdown -r now,該命令直接將系統(tǒng)重啟,而不進(jìn)行任何清理或準(zhǔn)備工作,確保系統(tǒng)徹底重啟,但也有很多其他命令,詳細(xì)如下文介紹2024-10-17教你如何在Linux中使用apt命令? Linux APT命令實(shí)戰(zhàn)教程
apt是一個(gè)軟件包管理工具,apt命令相當(dāng)強(qiáng)大,要是在Ubuntu和Debian系統(tǒng)中使用,可以用來(lái)對(duì)軟件進(jìn)行安裝等操作,需要超級(jí)管理員(root)權(quán)限進(jìn)行操作2024-09-29