2015-06-01 74 views
4

我試圖安排laravel工作不重疊的每一分鐘,下面的文檔:http://laravel.com/docs/5.0/artisanLaravel 5:工作日程沒有重疊

當我運行$schedule->call('Cron::myjob');它的偉大工程,和火災的每一分鐘,

當我嘗試修改它,所以它從不重疊:$schedule->call('Cron::myjob')->name('job-name')->withoutOverlapping();它觸發一次,永不再次。

我在做什麼錯?我的命令使用「return」將動作發送回作業,所以它應該知道它已完成。

編輯:我發現了這個問題。這似乎是我第一次運行命令,但沒有「返回」該動作,因此它再也不會運行該命令。我選擇了一個新的作業名稱,並再次運行命令,並且所有內容都正常工作

回答

6

爲了防止重疊,Laravel使用名爲"schedule-xxxxxx"的文件,其中xxxxxx是不應與自身重疊的命令的散列。這些文件被放置在storage/framework。如果執行該命令時出現問題,該文件可能不會被刪除,導致該命令無法再次運行。

OP做了什麼 - 重命名命令 - 是一種解決方法。稍微簡單一個刪除互斥文件:

rm storage/framework/schedule-*

但這些都不是真正的解決辦法,除非你是100%肯定該命令將始終從現在開始正常運行。否則,問題很快就會重演。

最後我把這樣的事情在我的cron文件:

find /var/www/storage/framework/ -name schedule-5b904de82f094302106f83418c5adb01 -mmin +20 | xargs -I{} rm {}

我希望命令不會超過一分鐘,以少跑。計劃每5分鐘運行一次。所以如果它的互斥文件大於20分鐘,我認爲這次出現了一些錯誤,應該允許該命令再次運行。

這也遠非完美,因爲它與它試圖保護的命令是分開的,因此如果命令被重命名或者整個應用程序被移動到某處,就很容易忘記。它也不能保護互斥文件沒有被刪除,因爲命令實際上運行,只有一些出錯,它比平時花費更多的時間。在這種情況下,重疊將被允許,一切都可能炸燬。但它至少在現在解決了我的問題。

+0

我永遠不會想到存儲/框架目錄中的隨機未刪除文件導致我的作業不能運行。乾杯! – ahaurat

+0

@ahaurat實際上很容易弄清楚。只需看看供應商代碼。請參閱[this](http://stackoverflow.com/questions/41052802/laravel-non-overlapping-scheduled-job-not-executing)。 – linuxartisan