用php做了一個(gè)網(wǎng)站,其中一個(gè)統(tǒng)計(jì)工能,需要每周定時(shí)用行。想看看有什么方法,之前看別人的東西,一般有2中方式,一個(gè)是php自帶的定時(shí)任務(wù),一個(gè)是用系統(tǒng)
帶的,linux下的crontab和windows下的定時(shí)任務(wù)。
之前用了php自帶的定時(shí)任務(wù)工能,發(fā)現(xiàn)實(shí)現(xiàn)起來很簡(jiǎn)單,中間也沒出現(xiàn)很多問題,同時(shí)做的時(shí)候?qū)? ob_flush() 和 flush() 等函數(shù)不是很熟,后來又看了相關(guān)的一些文章,
對(duì)其中的東西有了深入的了解。但是后來發(fā)現(xiàn)php定時(shí)任務(wù)開啟后,貌似不能停止,不需要重啟服務(wù)器才行。不能通過修改php文件來解決。
后來就打算用linux下的crontab來實(shí)現(xiàn)。這次用的是Ubuntu來做部署系統(tǒng),nginx來做服務(wù)器。此系統(tǒng)下自帶crontab,所以不用自己安裝。
開啟crontab日志
crontab默認(rèn)情況下是不執(zhí)行開啟日子的,所以一開始寫完后,不能執(zhí)行,想查看日志,卻找不到。所以先開啟定時(shí)任務(wù)的日志來查看
修改rsyslog服務(wù),將 /etc/rsyslog.d/50-default.conf 文件中的 #cron.* 前的 # 刪掉;用以下命令重啟rsyslog服務(wù):
service rsyslog restart;
然后再重啟crontab服務(wù):
service cron restart;
網(wǎng)上很多人說開啟,停止或者重啟contab服務(wù)用命令 service crond restart,執(zhí)行這個(gè)命令會(huì)報(bào)出 unrecognised service ,這里吧 crond 改成 cron 就可以了。
之后,在這個(gè)位置 /var/log/cron.log 就可以查看定時(shí)任務(wù)的文件日志文件了;
下面這個(gè)命令還可以查看crontab的狀態(tài)
service cron status;
查看運(yùn)行時(shí)的日志文件,如果在日志文件中執(zhí)行一條語句后出現(xiàn):
No MTA installed, discarding output
則crontab執(zhí)行腳本時(shí)是不會(huì)直接錯(cuò)誤的信息輸出,而是會(huì)以郵件的形式發(fā)送到郵箱里,需要郵件服務(wù)器了,如果沒有安裝郵件服務(wù)器,它就會(huì)報(bào)這個(gè)錯(cuò)。
可以在每條定時(shí)腳本后面加入:
>/dev/null 2>&1
即將所有信息輸入到linux系統(tǒng)中的空設(shè)備/dev/null中。
即可解決No MTA installed, discarding output的問題。
寫定時(shí)任務(wù)
通過如下命令,就可以開啟本用戶的定時(shí)文件,文件存放在 /var/spool/cron/crontabs 文件夾下
并且以用的的名字命名的文件
crontab -e
可以通過以下命令列出某個(gè)用戶cron服務(wù)的詳細(xì)內(nèi)容
crontab -l
我先寫了個(gè)定時(shí)任務(wù)測(cè)試以下,用php寫了一個(gè)功能,每分鐘向數(shù)據(jù)庫(kù)中寫入一條數(shù)據(jù),定時(shí)任務(wù)每分鐘執(zhí)行url就可以
1 * * * * curl servername/Home/Test/test >/dev/null 2>&1
curl也是Ubuntu自帶的,不用另外安裝。此條命令單獨(dú)在命令行執(zhí)行是可以的。
在crontab中發(fā)現(xiàn)好像不能執(zhí)行,后來發(fā)現(xiàn)每分鐘不能這樣寫,分鐘位要寫成 */1,才能執(zhí)行,下面是從別人那拷貝過來的幾個(gè)命令,不過我都試過
每五分鐘執(zhí)行 */5 * * * *每小時(shí)執(zhí)行 0 * * * *每天執(zhí)行 0 0 * * *每周執(zhí)行 0 0 * * 0每月執(zhí)行 0 0 1 * *每年執(zhí)行 0 0 1 1 *
在最終能用之前我還運(yùn)行過以下命令,是給root賦權(quán)限。但是在我最終能運(yùn)行時(shí),我不知道這條命令有沒有起作用。不過還是先寫上。運(yùn)行后需要重啟crontab服務(wù)
crontab -u root /var/spool/cron/crontabs/root之前不能運(yùn)行的時(shí)候,看到很多人說不能運(yùn)行是環(huán)境變量的問題,需要修改。不過我這次并沒有遇到。不過先記下來。以后可能會(huì)用到。
我用的是root用戶寫的定時(shí)任務(wù),并且看到他人寫的下面內(nèi)容,下次試一下
/etc/cron.deny 表示不能使用crontab 命令的用戶
/etc/cron.allow 表示能使用crontab的用戶。
如果兩個(gè)文件同時(shí)存在,那么/etc/cron.allow 優(yōu)先。
如果兩個(gè)文件都不存在,那么只有超級(jí)用戶可以安排作業(yè)。
新聞熱點(diǎn)
疑難解答
圖片精選