修正 Nextcloud Cron 作業無法自動執行的問題(使用 systemd)

若要讓 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 介面。

1. 確認安裝路徑、使用者和 PHP CLI。

在編輯單元之前,請先找到 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 命令的失敗。

2. 創建一次性服務

創造/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 版本。

3. 建立計時器

創造/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單元即可使排程任務自動運作。

4. 重新載入 systemd 並啟用定時器

讓 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在儲存檔案後執行了相關命令。

5. 執行一次測試並檢查其結果

您可以無需等待下一個計時器滴答即可啟動該服務一次:

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 的上次運行時間持續遞增。如果以上三點都滿足,但某個應用程式任務仍然出現延遲,則可能是調度程序正在運行,而該任務正在等待其自身的計劃、維護視窗或佇列條件滿足。在變更定時器間隔之前,請單獨診斷該任務。

官方參考資料

留下評論

修正 Nextcloud Cron 作業無法自動執行的問題(使用 systemd)

修正 Nextcloud Cron 作業無法自動執行的問題(使用 systemd)

透過檢查服務使用者、PHP 和 Nextcloud 路徑、定時器啟動和作業運行歷史記錄,對 Ubuntu 上的 Nextcloud systemd cron 定時器進行故障排除。

如何在 BigBlueButton 中配置 Etherpad 集成

如何在 BigBlueButton 中配置 Etherpad 集成

在 BigBlueButton 4.0 beta.4 或更早版本中啟用 Etherpad 共享筆記。安裝可選軟體包,選擇會議等級或全域預設值,並排查代理問題。

修復 Nextcloud 2GB 上傳限制:如何允許上傳大文件

修復 Nextcloud 2GB 上傳限制:如何允許上傳大文件

透過檢查 PHP、Nginx 或 Apache、反向代理、逾時設定和存儲,修復 Nextcloud 2GB 上傳限制。使用大於原始限制的檔案安全地測試變更。

如何使用 Let's Encrypt 為 ownCloud 伺服器設定 SSL/HTTPS

如何使用 Let's Encrypt 為 ownCloud 伺服器設定 SSL/HTTPS

在 Apache 上為 ownCloud 伺服器設定 Let's Encrypt HTTPS。檢查 DNS 和端口,使用 Certbot 頒發證書,啟用重定向,並測試續約。

修復版本升級後 ownCloud “完整性檢查失敗” 的問題

修復版本升級後 ownCloud “完整性檢查失敗” 的問題

升級後診斷 ownCloud 完整性警告,並為核心檔案不符、檔案缺失、額外檔案或應用程式簽署錯誤選擇安全的修復方案。

如何在 ownCloud 伺服器中限制公共連結的過期日期

如何在 ownCloud 伺服器中限制公共連結的過期日期

為 ownCloud Server 公共連結設定最長過期日期,了解它會影響哪些共享,並在不忽略較舊連結的情況下驗證策略。

如何配置 Zimbra GAL 自動同步並驗證其是否正常運作

如何配置 Zimbra GAL 自動同步並驗證其是否正常運作

設定 Zimbra GAL 自動同步,設定輪詢間隔,強制執行測試同步,驗證時間戳,並追蹤過時的內部或外部 LDAP 聯絡人。

如何在 ownCloud Infinite Scale 中設定 LDAP 身份驗證

如何在 ownCloud Infinite Scale 中設定 LDAP 身份驗證

為 ownCloud Infinite Scale 配置 LDAP 支援的登錄,映射使用者和群組,選擇內建或外部 OIDC,保護憑證,並安全地驗證身份驗證。

如何從 ownCloud 10 Classic 遷移到 ownCloud Infinite Scale

如何從 ownCloud 10 Classic 遷移到 ownCloud Infinite Scale

使用支援的 migrate-to-ocis 應用程式規劃 ownCloud Classic 10 到 Infinite Scale 的遷移。了解哪些資料會遷移,哪些資料不會遷移,LDAP 先決條件,指令以及切換檢查。

如何在 Zimbra 中安全地設定 SpamAssassin 自訂規則

如何在 Zimbra 中安全地設定 SpamAssassin 自訂規則

了解 Zimbra 在何處載入自訂 SpamAssassin 規則、如何編寫和驗證 .cf 規則、重新啟動 Amavis、測試郵件頭以及如何安全地回溯。