2009-12-29 128 views
1

我有一個PHP腳本,我需要每分鐘運行一次。我已經確定了腳本命令行工作,而我使用絕對路徑,以避免任何環境問題:無法讓PHP cron腳本運行

/usr/bin/php -q /var/www/myapp/services/myservice.php 

手動運行作爲命令行根正常工作,因爲我可以從看我的腳本寫入的日誌文件。可以肯定的是,該腳本也具有執行權限。

然而,在cron放置完全相同的命令時:

* * * * * /usr/bin/php -q /var/www/myapp/services/myservice.php 

它不運行或者至少看起來如此。我已經嘗試將輸出重定向到另一個日誌文件:

* * * * * /usr/bin/php -q /var/www/myapp/services/myservice.php >> /mylog.log 2>&1 

什麼都沒有。我沒有任何跡象表明腳本正在運行。我想這不是,但我不知道還有什麼要尋找。我甚至重新啓動了cron守護進程。

我知道在StackOverflow上有類似的問題,但沒有一個答案證明是我的解決方案。這實際上讓我瘋狂,我會非常感謝任何幫助。

+0

運行它,這是Linux或類似的操作系統? – wallyk 2009-12-29 03:03:12

回答

1

你錯過了running user部分:

*  *  *  *  *  nobody /usr/bin/php -q /var/www/myapp/services/myservice.php >> /mylog.log 2>&1 
+0

哪個cron需要它?我的freebsd和ubuntu盒子上的/ etc/crontab告訴了我 – paxdiablo 2009-12-29 03:24:23

+0

。 我不知道你是否可以在不指定正在運行的用戶的情況下運行crontab。但是,我總是這樣做,設置誰應該運行腳本。 – ariefbayu 2009-12-29 16:03:20

1

通常需要做很多事情來將可執行文件從命令行移動到cron作業。

默認情況下,cron作業會得到一個最小的環境,它幾乎肯定不會擁有您的登錄會話所具有的完整路徑(以及大量其他環境變量)。您也可能不在同一個目錄中(如您所發現的)。

我傾向於做的是執行:

env | sed 's/^/export /' >$HOME/cron.env 

從一個登錄會話得到充分的環境,然後確保我的cron作業在嘗試做真正的工作之前執行該腳本。生成的腳本可能需要少量整理(引用,刪除諸如_PWD等的瞬態環境變量)。

這樣我可以確定登錄和cron環境是相同的。

+0

你說得對,我必須在腳本中「重置」幾個路徑變量。 – Ferdy 2009-12-29 12:31:06

0

這可能被認爲是「不好的做法」,但它適用於我。

,捲曲

* * * * * curl -s http://www.domain.com/services/myservice.php 
+0

糟糕的做法與否,我從來沒有找到任何其他方式來做到這一點。特別是如果你試圖擊中數據庫和什麼。一切都在爲此而努力。 (請參閱paxdiablo的答案。) – 2009-12-29 06:27:00

+0

我特別不想使用curl,原因有兩個:1)它涉及TCP/IP和Web服務器開銷,而此腳本不需要該開銷。 2)我有一個受htaccess保護的開發環境,我不想在curl命令中發送純文本密碼。請檢查下面我自己的答案,我現在正常工作:) – Ferdy 2009-12-29 12:30:17