About gem whenever & crontab

問題描述

在 rails 專案裡面使用 whenever gem 來設定排程,整合到 capistrano(v3)參考 之後,發現排程沒有被設定成功。

解決方法

  1. 檢查 Capfile 裡面有無加入 require 'whenever/capistrano' 在 capistrano v3 版本裡面,不需要加上 set :whenever_command, "bundle exec whenever --update-crontab" 指令,v3 版本已有整合 程式碼

  2. 檢查在 config/deploy/production.rb 裡面有無加入 Rake::Task['whenever:update_crontab'].clear_actions,這樣的指令? 這個指令會把該 task 移除,這樣部署的時候就不會更新 crontab 排程內容,所以要把這個指令移除。

  3. 修改好以後重新部署,檢查 crontab 內容是否有更新。

    1
    $ crontab -l

    你應該會看到類似這樣的內容:

    1
    2
    3
    # Begin Whenever generated tasks for: yourapp at: 2023-02-16 17:09:27 +0000
    ......
    # End Whenever generated tasks for: yourapp at: 2023-02-16 17:09:27 +0000
  4. 如果還是沒有更新或沒有執行,可以檢查 config/schedule.rb 裡面的排程內容是否有誤,或是config/deploy/production.rb 裡面的 roles 相關設定是否有誤。

  5. 另外可以檢視 /var/log/cron 裡面的內容,看看是否有錯誤訊息。

參考資料

有時候你可能想要手動測試排程是否有正常執行,可以使用 whenever --update-crontab 指令來更新 crontab 內容,然後使用 crontab -l 指令來檢查 crontab 內容是否有更新,如果有更新,就可以使用 crontab -e 指令來編輯 crontab 內容,然後把 # 移除,這樣就可以手動測試排程是否有正常執行。
P.S. cron 是不需要重新啟動的,只要更新 crontab 內容就可以了。