修正 Nextcloud Cron 作業無法自動執行的問題(使用 systemd)
透過檢查服務使用者、PHP 和 Nextcloud 路徑、定時器啟動和作業運行歷史記錄,對 Ubuntu 上的 Nextcloud systemd cron 定時器進行故障排除。
若要讓 Nextcloud 後台任務透過 systemd 自動執行,請設定以 Web 伺服器使用者身分執行的一次性服務cron.php,然後啟用計時器,每五分鐘啟動一次該服務。關鍵檢查點包括:定時器已啟用並設定了下次運行時間,服務指向正確的 Nextcloud 和 PHP 路徑,以及服務日誌顯示已成功退出。一次性服務在兩次運行之間可能會顯示「不活動(已停止)」狀態;這在服務完成後屬於正常現象。
此配置適用於在 Ubuntu 上使用 systemd 進行傳統的 Nextcloud 安裝,Nextcloud 檔案位於主機上。如果 Nextcloud 運行在 Docker、Snap 或 Nextcloud All-in-One 等容器中,請使用該發行版文件中提供的調度方法,而不是將主機單元指向僅容器化的路徑。以下範例使用了 `<path>`/var/www/nextcloud和www-data`<user>`;請將它們替換為伺服器上的實際安裝路徑和 HTTP 使用者。
Nextcloud 會cron.php執行排隊後台任務,例如維護和應用程式任務。 systemd 定時器是計時器;服務則是定時器到期時執行的指令。兩者都必不可少。如果在未啟用定時器的情況下建立文件,則排程任務將處於非活動狀態;而啟用指向錯誤 PHP 或 Nextcloud 路徑的定時器則可能導致重複執行失敗。
Nextcloud 建議使用系統定時任務 (system cron) 來執行生產環境的背景作業。其目前的管理手冊也提到可以使用 systemd 定時器作為替代方案。範例排程任務會在系統啟動五分鐘後開始運行,然後在每次服務啟動後五分鐘再次運行。這樣就避免了使用者存取 Web 介面。
在編輯單元之前,請先找到 Nextcloud 的實際目錄,並檢查 Web 伺服器安裝程式需要哪個 PHP 指令。在典型的 Ubuntu 歸檔安裝中,路徑可能是 `/etc/Nextcloud/` /var/www/nextcloud,Web 使用者通常是`/etc/Nextcloud/ www-data`,PHP CLI 是 `/etc/PHP/` /usr/bin/php。請務必進行驗證,不要想當然:
ls -l /var/www/nextcloud/cron.php
command -v php
php -v
如果您的 Nextcloud 目錄位於其他位置,請在下方的兩個單元指令中取代目錄。如果 Web 伺服器使用單獨的 PHP 版本,請在 `<command>`ExecStart和 `<command>`中使用該版本的 CLI 執行檔ExecCondition。 systemd 服務不會繼承互動式 shell 的 PATH 或環境變量,因此明確路徑更可靠。
使用與 systemd 相同的使用者身分測試狀態檢查:
sudo -u www-data /usr/bin/php -f /var/www/nextcloud/occ status -e
為了確保檔案所有權和權限正確, Nextcloudocc命令應該以 HTTP 使用者身分執行。如果此測試報告 PHP 錯誤、進入維護模式或缺少文件,請先修正這些問題;計時器無法彌補 Nextcloud 命令的失敗。
創造/etc/systemd/system/nextcloudcron.service:
sudo nano /etc/systemd/system/nextcloudcron.service
請輸入此單元訊息,如果您的安裝方式不同,請調整路徑和使用者:
[Unit]
Description=Nextcloud cron.php job
[Service]
User=www-data
ExecCondition=/usr/bin/php -f /var/www/nextcloud/occ status -e
ExecStart=/usr/bin/php -f /var/www/nextcloud/cron.php
KillMode=process
ExecCondition在啟動背景任務之前,會檢查 Nextcloud 是否正常運作。如果條件不成立,systemd 將跳過該任務;請查看日誌以了解原因。KillMode=process允許由背景任務啟動的外部程式在主 cron 進程退出後繼續執行。目前的 Nextcloud 範例不需要[Install]在此服務文件中新增相應部分。
僅當伺服器上安裝了正確的 CLI 解釋器時才適用/usr/bin/php。例如,自訂 PHP 倉庫可能會安裝一個版本化的二進位。請使用 Nextcloud 及其 Web 伺服器設定所需的相容 PHP 版本。
創造/etc/systemd/system/nextcloudcron.timer:
sudo nano /etc/systemd/system/nextcloudcron.timer
添加:
[Unit]
Description=Run Nextcloud cron.php every 5 minutes
[Timer]
OnBootSec=5 min
OnUnitActiveSec=5 min
Unit=nextcloudcron.service
[Install]
WantedBy=timers.target
OnBootSec首次運行安排在 systemd 啟動後五分鐘。OnUnitActiveSec第二次運行安排在服務上次啟動後五分鐘。此定時器與服務本身不同:啟用並啟動該.timer單元即可使排程任務自動運作。
讓 systemd 讀取新的單元文件,然後使用一條命令啟用並啟動計時器:
sudo systemctl daemon-reload
sudo systemctl enable --now nextcloudcron.timer
檢查計時器:
systemctl status nextcloudcron.timer
systemctl list-timers --all | grep nextcloudcron
計時器應該已載入並處於活動狀態,並且list-timers在「下一步」下方應顯示未來的時間。如果計時器已停用、未載入或沒有“下一步”啟動選項,請確認檔案名稱以“.”結尾.timer,該[Install]部分包含WantedBy=timers.target“.”,並且您daemon-reload在儲存檔案後執行了相關命令。
您可以無需等待下一個計時器滴答即可啟動該服務一次:
sudo systemctl start nextcloudcron.service
sudo systemctl status nextcloudcron.service
sudo journalctl -u nextcloudcron.service -n 50 --no-pager
查看服務結果以及任何 PHP 或 Nextcloud 錯誤。命令執行完畢後,nextcloudcron.service可能會返回inactive (dead)預設狀態,因為它是一次性任務。但這並不意味著任務失敗。計時器應該保持活動狀態並安排下一次運行;日誌應該顯示上次運行是否成功退出。
在 Nextcloud 管理設定中,開啟後台作業狀態區域,並確認定時器觸發後,上次作業執行時間是否有增加。當 Nextcloud 偵測到最近的後台活動時,概覽警告應該會消失。啟用定時器後,至少等待一個時間間隔,然後再判斷排程任務是否執行。
| 你所看到的 | 需要檢查什麼 | 下一步 |
|---|---|---|
| 計時器處於“非活動”狀態或已停用 | 定時器單元是否已啟用並啟動 | 運行sudo systemctl enable --now nextcloudcron.timer,然後檢查systemctl list-timers |
| 計時器已激活,但服務失敗 | 服務日誌、PHP 可執行檔、Nextcloud 路徑和服務用戶 | 執行狀態測試www-data;修正第一個報告的 PHP 或檔案權限錯誤 |
| 該服務在兩次運行之間處於非活動狀態 | 計時器的下次計時時間和該服務的最後一筆日誌記錄 | 如果服務已成功退出且計時器仍然處於活動狀態,這對於一次性單元來說是正常的。 |
服務在未運行的情況下退出cron.php | 結果ExecCondition以及 Nextcloud 是否處於維護模式 | 解決故障條件並檢查 Nextcloud 狀態後,再手動重新啟動作業。 |
| 管理頁面仍然顯示 cron 任務尚未運行 | 該服務是否真的呼叫了正確的實例,以及其上次執行時間是否有變更。 | 等待一段時間(例如,經過一個定時器間隔),檢查日誌,並確認您正在檢查的是同一個 Nextcloud 安裝。 |
如需了解更多詳情,請查看最近的服務日誌和 Nextcloud 日誌檔案:
sudo journalctl -u nextcloudcron.service --since "30 minutes ago" --no-pager
sudo -u www-data /usr/bin/php -f /var/www/nextcloud/occ background-job:list
任務清單顯示了已註冊的任務,但這本身並不能證明計時器正在執行。需要結合計時器的上次和下次啟動時間、服務日誌以及 Nextcloud 的上次運行時間指示器進行判斷。
當伺服器執行 systemd 服務且您需要本機服務管理的定時任務時,systemd 定時器非常適用。如果您已經執行了一個標準的 cron 守護程式,並且可以驗證其 crontab 文件,那麼也支援使用呼叫相同功能的系統 cron 條目cron.php。www-data請勿在同一個 Nextcloud 實例上同時使用這兩種方法;重疊呼叫會浪費資源並使故障排除更加複雜。
AJAX 調度依賴用戶對 Nextcloud 的訪問,因此對於繁忙或多用戶的伺服器來說可靠性較低。 Webcroncron.php透過 HTTP 調用,可能適用於系統存取不可用的小型實例,但 Nextcloud 指出,Web 執行限制了每次調用可以運行的工作量。如果 Nextcloud 是容器化的或由裝置管理的,請使用其支援的排程器或容器配置;/var/www/nextcloud如果主機上不存在相應的路徑,則主機服務將無法正常運作。
一個健康的配置應具備以下條件:啟用定時器並設定循環的「下次運行時間」;服務運行無 PHP 錯誤;Nextcloud 的上次運行時間持續遞增。如果以上三點都滿足,但某個應用程式任務仍然出現延遲,則可能是調度程序正在運行,而該任務正在等待其自身的計劃、維護視窗或佇列條件滿足。在變更定時器間隔之前,請單獨診斷該任務。
透過檢查服務使用者、PHP 和 Nextcloud 路徑、定時器啟動和作業運行歷史記錄,對 Ubuntu 上的 Nextcloud systemd cron 定時器進行故障排除。
在 BigBlueButton 4.0 beta.4 或更早版本中啟用 Etherpad 共享筆記。安裝可選軟體包,選擇會議等級或全域預設值,並排查代理問題。
透過檢查 PHP、Nginx 或 Apache、反向代理、逾時設定和存儲,修復 Nextcloud 2GB 上傳限制。使用大於原始限制的檔案安全地測試變更。
在 Apache 上為 ownCloud 伺服器設定 Let's Encrypt HTTPS。檢查 DNS 和端口,使用 Certbot 頒發證書,啟用重定向,並測試續約。
升級後診斷 ownCloud 完整性警告,並為核心檔案不符、檔案缺失、額外檔案或應用程式簽署錯誤選擇安全的修復方案。
為 ownCloud Server 公共連結設定最長過期日期,了解它會影響哪些共享,並在不忽略較舊連結的情況下驗證策略。
設定 Zimbra GAL 自動同步,設定輪詢間隔,強制執行測試同步,驗證時間戳,並追蹤過時的內部或外部 LDAP 聯絡人。
為 ownCloud Infinite Scale 配置 LDAP 支援的登錄,映射使用者和群組,選擇內建或外部 OIDC,保護憑證,並安全地驗證身份驗證。
使用支援的 migrate-to-ocis 應用程式規劃 ownCloud Classic 10 到 Infinite Scale 的遷移。了解哪些資料會遷移,哪些資料不會遷移,LDAP 先決條件,指令以及切換檢查。
了解 Zimbra 在何處載入自訂 SpamAssassin 規則、如何編寫和驗證 .cf 規則、重新啟動 Amavis、測試郵件頭以及如何安全地回溯。