在Linux中使用crontab時需要注意哪些問題?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
十余年的鄉(xiāng)寧網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。網(wǎng)絡(luò)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整鄉(xiāng)寧建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)從事“鄉(xiāng)寧網(wǎng)站設(shè)計”,“鄉(xiāng)寧網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
crontab是一個用于設(shè)置周期性被執(zhí)行的指令。其守護進程為crond. crontab分為兩種配置模式,一種為用戶級的crontab,一種為系統(tǒng)級的crontab,這里我們分開來談。
用戶級crontab
用戶使用新建循環(huán)型工作調(diào)度時,使用的crontab命令,crontab -e所有用戶都可以使用,普通用戶也只能為自己設(shè)置計劃任務(wù)。然后自動寫入/var/spool/cron/usename
用戶控制文件
/etc/cron.allow :
將可以使用crontab的用戶寫入,僅該文件內(nèi)的用戶可以使用crontab,相當(dāng)于白名單
/etc/cron.deny :
將禁止使用crontab的用戶寫入,僅該文件內(nèi)的用戶禁止使用crontab,相當(dāng)于黑名單
其中/etc/cron.allow優(yōu)先級大于/etc/cron.deny,為避免混淆,建議二者僅使用一個。
命令
crontab [-u usename] [-l|-e|-r] 參數(shù): -u:只有root才能進行這個任務(wù),也即幫其他用戶新建/刪除crontab工作調(diào)度 -e: 調(diào)用vi編輯crontab的工作內(nèi)容 -l: 列出crontab的工作內(nèi)容 -r: 刪除所有crontab的工作內(nèi)容。
語法
# .---------------- 分鐘 (0 - 59) # | .------------- 小時 (0 - 23) # | | .---------- 日期 (1 - 31) # | | | .------- 月份 (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- 周幾 (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * 命令
語法與系統(tǒng)級crontab很相似,不同點在于此處不需要指定執(zhí)行用戶,而系統(tǒng)級crontab(/etc/crontab)中需要。
舉例如下:
*/10 * * * * /home/test.sh #每隔10分鐘就以當(dāng)前用戶執(zhí)行一次/home/test.sh腳本 0 2 * * * /home/test.sh #每天2點 0 5,17 * * * /home/test.sh #每天5點、17點 0 17 * * sun /home/test.sh #每周日17點 0 4,17 * * sun,mon /home/test.sh#每周一、周日 @reboot /home/test.sh #系統(tǒng)重啟時
這里推薦一個在線小工具:在線生成cron表達式
系統(tǒng)級crontab
系統(tǒng)級crontab一般用于系統(tǒng)的例行性任務(wù),這種方法更加方便與直接直接給其他用戶設(shè)置計劃任務(wù),而且還可以指定執(zhí)行shell等。配置文件為/etc/crontab,該文件僅root用戶能夠編輯。
編輯/etc/crontab
默認內(nèi)容如下:
SHELL=/bin/bash 這里是指定使用哪種shell接口 PATH=/sbin:/bin:/usr/sbin:/usr/bin 這里指定文件查找路徑 MAILTO=root 如果有額外的STDOUT,以email將數(shù)據(jù)送給誰,可以指定系統(tǒng)用戶,也可以指定email地址,如alliot@iots.vip # For details see man 4 crontabs # Example of job definition: # .---------------- 分鐘 (0 - 59) # | .------------- 小時 (0 - 23) # | | .---------- 日期 (1 - 31) # | | | .------- 月份 (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- 周幾 (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * 用戶名 命令
即:
分 時 日 月 周 執(zhí)行用戶 任務(wù)命令
比如我要添加一個計劃任務(wù),每隔10分鐘就以root身份執(zhí)行一次/home/test.sh腳本,則在后面添加:
*/10 * * * * root /home/test.sh
這里注意,不要漏掉執(zhí)行者root(用戶級的crontab中不需要指定執(zhí)行者),否則會在/var/log/cron日志中出現(xiàn)”ERROR (getpwnam() failed)”錯誤,計劃任務(wù)無法正常運行。
重啟服務(wù)
一般來說Linux下的crontab會自動幫我們每分鐘重新讀取一次 /etc/crontab 的例行工作事項,但是出于某些原因或者是其他的Unix系統(tǒng)中,由于crontab是讀到內(nèi)存當(dāng)中的,所以栽修改完 /etc/crontab 之后,可能并不會馬上執(zhí)行,這時候需要重啟crontab服務(wù)。
這里以CentOS為例:
service crond start //啟動服務(wù) service crond stop //關(guān)閉服務(wù) service crond restart //重啟服務(wù) service crond reload //重載配置 service crond status //服務(wù)狀態(tài)
如果是CentOS 7則:
systemctl restart crond.service //重啟服務(wù) systemctl start crond.service //啟動服務(wù) systemctl stop crond.service //停止服務(wù) systemctl reload crond.service //重載配置 systemctl status crond.service //服務(wù)狀態(tài)
其他注意事項
取消不需要的輸出
當(dāng)執(zhí)行結(jié)果或者執(zhí)行的選項中有輸出的數(shù)據(jù)時,該數(shù)據(jù)會通過mail發(fā)送給MAILTO指定的賬號,若某一個調(diào)度一直出錯,同時mail服務(wù)出現(xiàn)問題(事實上我根本就沒開這個服務(wù)),將會產(chǎn)生大量的文件于 /var/spool/clientmqueue/ ,所以最好是將crontab里面的命令后面加上> /dev/null 2>&1
2>:重定向錯誤。
2>&1:把錯誤重定向到輸出要送到的地方。即把上述命令的執(zhí)行結(jié)果重定向到 /dev/null ,即拋棄,同時,把產(chǎn)生的錯誤也拋棄。
檢查日志
日志保存在 /var/log/cron 中
語法區(qū)別
crontab -e命令會檢查語法,而vim編輯 /etc/crontab 則不會,這里注意的是,crontab -e不需要寫執(zhí)行者用戶名,而 /etc/crontab 需要指定。
執(zhí)行路徑必須使用絕對路徑,否則可能無法正常執(zhí)行。
周與日、月不能共存,即你可以分別以周或者是日、月為單位進行循環(huán),但不可指定“幾月幾號且為星期幾”的模式工作。
看完上述內(nèi)容,你們掌握在Linux中使用crontab時需要注意哪些問題的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!