ownCloudのCronジョブが実行されない問題を解決する:信頼性の高いsystemdタイマーを設定する

ownCloudの管理ページを開くと、バックグラウンドジョブが最近実行されていない、またはクリーンアップ、アクティビティ、外部ストレージ、その他のキューに入れられたタスクが遅れているように見えることがあります。よくある反応は、cron.phpcrontabエントリを編集または追加することです。現在のownCloud Serverのドキュメントでは、これは最適な出発点ではありません。ownCloudは、Cronバックグラウンドモードとocc system:cronコマンドの使用を推奨しています。Linuxホストでは、従来のcrontabの代わりにsystemdタイマーを使用してスケジューリングレイヤーを提供できます。

このガイドでは、ownCloud が などのパスに配置されているパッケージまたはベアメタルスタイルのインストールに焦点を当てています/var/www/owncloud。ownCloud の公式 Docker イメージを使用する場合は、ホストタイマーを作成する前に停止してください。ownCloud のドキュメントには、イメージが や などの変数によって制御される cron を内部的に構成することが記載されていますOWNCLOUD_CROND_ENABLED。OWNCLOUD_CROND_SCHEDULE最新のownCloud バックグラウンド ジョブのドキュメントを参照してください。

何が検証済みで、何がサーバーに依存し、何がまだ確認が必要なのか

  • 検証済み: ownCloudは、信頼性の高いバックグラウンド実行にはAJAXではなくCronを推奨しており、occ system:cronキューに入れられたバックグラウンドジョブを実行するためのコマンドとしてドキュメント化しています。
  • インストール方法によって異なります。ownCloudディレクトリ、PHPバイナリ、Webサーバーアカウント、PHP環境、そしてパッケージインストール、コンテナ、アプライアンス、カスタムデプロイメントのいずれを実行しているかによって変わります。
  • 一般的なガイドでは、現在のジョブが失敗した理由を特定することはできません。スケジューラの問題である可能性もありますが、権限の問題、パスの誤り、PHP CLIの設定の違い、データベース接続の問題、ファイルのロック、またはアプリケーションレベルのバックグラウンドジョブの失敗などが原因である可能性もあります。

対処法:タイマーに使用するアカウントと同じアカウントで、ownCloudのコマンドが手動で正常に動作することが確認できるまで、タイマーを作成しないでください。

ステップ1:Cronモードを確認し、ownCloudを手動でテストする

一般的なApache/Debianスタイルのインストールでは、Webユーザーは ですwww-data。環境が異なる場合は、ユーザー名とパスの両方を置き換えてください。

sudo -u www-data /var/www/owncloud/occ background:cron
sudo -u www-data /var/www/owncloud/occ system:cron

最初のコマンドは、ownCloudのCronバックグラウンドジョブモードを選択します。2番目のコマンドは、キューに登録されたバックグラウンドジョブを実際に実行します。ownCloudのoccコマンドのドキュメントにはsystem:cron、このコマンドはスケジュール実行を目的としており、非対話型スケジューラでは進捗状況の出力は有効にすべきではないと記載されています。

ownCloudのCronモードと、www-dataユーザーとして手動でocc system:cronを実行する様子を示すUbuntuターミナル。
systemdが関与する前に、手動チェックが成功するはずです。出力結果は異なる場合がありますが、重要なのはコマンドの終了ステータスとアプリケーションエラーの有無です。

よくある誤解: ownCloudの「Cronモード」は、cron必ずしもデーモンを使用する必要があるという意味ではありません。ownCloudがバックグラウンドジョブランナーを呼び出すために外部スケジューラを必要とするという意味です。systemdタイマーをそのスケジューラとして使用できます。

対処法:手動コマンドが失敗した場合は、まずそのエラーを修正してください。タイマーは、スケジュールに基づいて同じ失敗を繰り返します。

ステップ2:正しいPHPとownCloudのパスを見つける

インストールによってはocc直接実行可能になる場合もあれば、PHP CLIバイナリで起動した方が動作が予測しやすい場合もあります。両方を確認してください。

command -v php
readlink -f /var/www/owncloud/occ
sudo -u www-data /usr/bin/php -f /var/www/owncloud/occ system:cron

ownCloudのドキュメントでは、スケジュールされたジョブがPHPを見つける必要があることを明示的に警告しており、そのためcronの例では完全なパスを示しています。これはsystemd環境でも同様に重要です。なぜなら、サービスは対話型シェル環境ではなく、制御された環境で実行されるからです。

対処方法:/usr/bin/php残りの例の、、、/var/www/owncloudおよびを、www-dataご使用のホストで正常に動作した値に置き換えてください。

ステップ3:ワンショットのsystemdサービスを作成する

作成する/etc/systemd/system/owncloud-cron.service:

[Unit]
Description=Run ownCloud background jobs
After=network.target

[Service]
Type=oneshot
User=www-data
Group=www-data
WorkingDirectory=/var/www/owncloud
ExecStart=/usr/bin/php -f /var/www/owncloud/occ system:cron

通常、サービス専用のセクションは必要ありません[Install]。タイマーがサービスを起動するからです。サービスをこのように設定しておくと、Type=oneshotライフサイクルも分かりやすくなります。サービスが起動し、コマンドを一度実行し、終了して、再び非アクティブになります。

Ubuntuターミナルに、Type=oneshot、www-data、WorkingDirectory、occ system:cronのowncloud-cron.serviceユニットが表示されている。
systemdサービスは、明示的なパスとウェブサーバーアカウントを使用して、手動で既に成功したコマンドと同じコマンドを呼び出す必要があります。

よくある誤解:非アクティブなワンショットサービスは自動的に停止するわけではありません。正常に実行されたワンショットサービスは、RemainAfterExit=yes通常、非アクティブになります。

対策:サービスの成功は、終了コードとログに基づいて判断し、サービスが「稼働し続ける」ことを期待してはいけません。

ステップ4:systemdタイマーを作成する

作成する/etc/systemd/system/owncloud-cron.timer:

[Unit]
Description=Run ownCloud background jobs every 15 minutes

[Timer]
OnCalendar=*:0/15
Persistent=true
Unit=owncloud-cron.service

[Install]
WantedBy=timers.target

ownCloudのホストcronのドキュメントでは、15分間隔のスケジュールを推奨しています。上記のタイマーもその間隔に従います。systemdはマシンが再び利用可能になった後にカレンダーの起動をトリガーできるため、タイマーPersistent=trueと併用すると便利ですOnCalendar。ただし、正確な動作はsystemdのバージョンとマシンのダウン時間によって異なります。

GNU nanoウィンドウに、OnCalendarが15分ごと、Persistentがtrue、owncloud-cronサービスが設定されているowncloud-cron.timerユニットが表示されています。
カレンダータイマーを使用すれば、ownCloudのドキュメントに記載されている15分間隔のcronサイクルを再現しつつ、スケジューリングとログ記録をsystemd内で実行できます。

対処法:意図的に異なる間隔が必要な場合は、他のサーバーから値をコピーするのではなく、意図的に変更してください。実行頻度が高すぎるとバックグラウンド負荷が増加し、低すぎるとキューに登録された処理が遅延する可能性があります。

ステップ5:systemdをリロードしてタイマーを有効にする

sudo systemctl daemon-reload
sudo systemctl enable --now owncloud-cron.timer
sudo systemctl status owncloud-cron.timer

daemon-reloadsystemdにユニットファイルを再読み込みさせます。enable --nowこれにより、今後の起動のためのタイマーが有効になり、同時に起動も即座に開始されます。

Ubuntuターミナルにsystemctl daemon-reload、enable --now owncloud-cron.timer、およびアクティブな待機タイマーステータスが表示されている。
有効になっているタイマーは通常、active (waiting)それがトリガーするサービスを表示し、識別するはずです。

対処法:タイマーがアクティブでない場合は、systemctl status owncloud-cron.timerownCloudの設定を再度変更する前に確認してください。

ステップ6:次のタイマーと前のタイマーの実行を確認する

systemctl list-timers owncloud-cron.timer
systemctl list-timers --all | grep owncloud-cron

list-timersこれは、systemdが次回の起動をスケジュールしたことを確認し、タイマーが最後に作動した日時を確認する最も簡単な方法です。これにより、「タイマーが一度も作動しなかった」場合と「タイマーは作動したが、ownCloudがサービス内で失敗した」場合を区別できます。

Ubuntuターミナルにowncloud-cron.timerが有効になっていることと、以前のアクティベーションと次のアクティベーションを含むlist-timersエントリが表示されている。
タイマー一覧には、タイマーユニットとそれが作動させるサービス、およびタイミング情報が表示される必要があります。
Ubuntuターミナルで、owncloud-cron.timerのsystemctl list-timersコマンドの出力結果(NEXT、LAST、UNIT、ACTIVATES列を含む)を表示しています。
目に見えるウェブアクティビティがないからといってcronが壊れていると決めつけるのではなく、NEXT列とLAST列を使用してスケジュールを確認してください。

対処方法: NEXTが表示されない場合、またはタイマーがリストにない場合は、タイマーのファイル名、[Install]セクション、およびユニットが有効になっているかどうかを再確認してください。

ステップ7:タイマーだけでなく、サービスジャーナルも確認してください。

systemd は、意図的に別の場所にリダイレクトしない限り、サービスの出力をジャーナルに記録します。公式のjournalctl ドキュメントには、systemd ユニットによるジャーナルエントリのフィルタリング方法が記載されています。

sudo journalctl -u owncloud-cron.service --since today
sudo journalctl -u owncloud-cron.service -n 100 --no-pager
Ubuntuターミナルに、owncloud-cron.serviceのjournalctlログ(開始、バックグラウンド処理、完了のエントリを含む)が表示されます。
サービスジャーナルは、スケジューラの成功とownCloudコマンドの失敗を区別する場所です。呼び出されたコマンドがエラーを返した場合でも、タイマーは正しく起動する可能性があります。

よくある誤解:「タイマーがアクティブになっているので、ownCloudのcronは正常に動作している。」 タイマーがアクティブになっているということは、スケジューラが起動待ちの状態にあることを示すだけで、サービスが正常に呼び出される必要があります。

対処方法: PHPエラー、アクセス拒否メッセージ、ファイルの欠落、データベースエラー、またはゼロ以外の終了ステータスを探します。タイマーを繰り返し再起動するのではなく、最初に発生した具体的なエラーを修正してください。

ステップ8:オンデマンドで1回実行してownCloudを検証する

最終テストのために15分待つ必要はありません。

sudo systemctl start owncloud-cron.service
sudo systemctl status owncloud-cron.service
sudo -u www-data /usr/bin/php -f /var/www/owncloud/occ status

ワンショット実行が成功した後、systemctl statusサービスを非アクティブとして報告しつつ、同時にも表示することができますstatus=0/SUCCESS。重要な結果は、コマンドが正常に完了したということです。

UbuntuターミナルにownCloudのoccステータス、owncloud-cron.serviceの手動systemctl起動、およびステータス0(成功)が表示されます。
手動でサービスを起動することは、systemdで設定された正確なコマンド、ユーザー、パス、およびPHP環境をエンドツーエンドでテストする実践的な方法です。

手順:手動サービステストが成功した後、少なくとも1回のスケジュールされたタイマーの起動を待ち、手動操作なしで新しいジャーナルエントリが表示されることを確認します。

それでも実行できない場合は、レイヤーごとにトラブルシューティングを行ってください。

観察された症状それが証明すること次のアクション
occ system:cron手動で失敗する問題はスケジューラ層より下の層にある。まず、PHP、権限、ownCloudの設定、データベース、またはアプリケーションのエラーを修正してください。
手動コマンドは機能するが、サービスが失敗するsystemdの実行環境はシェルとは異なりますUser=、、WorkingDirectory=フルパス、およびジャーナルを確認してください。
サービスは手動で動作し、タイマーには次の実行はありません。サービスは有効ですが、スケジュールは有効ではありません。タイマーの構文を確認し、systemdをリロードしてから、タイマーを有効にして開始してください。
タイマーにはNEXT/LAST時刻が表示されますが、ownCloudジョブは依然として遅延します。タイマーが作動しています別のスケジューラを作成するのではなく、サービスログとアプリケーションレベルのジョブを検査してください。
公式Dockerイメージホスト側のsystemdが間違ったレイヤーである可能性がありますownCloudが文書化している、イメージに組み込まれているcron設定を使用してください。

cron.phpと古いガイドに関する注意点

以前のownCloudの手順では、多くの場合、cron.php直接呼び出しが行われていました。現在のownCloudのドキュメントでは、 を推奨しておりocc system:cron、ownCloudのリリースノートでは、以前の直接cron.php呼び出し方式からの移行について説明しています。ownCloud Serverのリリースノートを参照してください。

対処法:古い crontab または systemd ユニットを引き継いで実行している場合はcron.php、それを保持する前に、インストールされている ownCloud リリースのドキュメントと比較してください。

最終確認チェックリスト

  • ownCloudはCronによるバックグラウンドジョブ用に構成されています。
  • occ system:cron意図したウェブサーバーアカウントでは、正確なコマンドが正常に実行されます。
  • owncloud-cron.timer有効になっていますactive (waiting)。
  • systemctl list-timers十分な時間が経過すると、次のアクティベーションと前のアクティベーションの両方が表示されます。
  • journalctl -u owncloud-cron.serviceスケジュールされた実行が正常に完了したことを示します。
  • この設定では、公式のownCloud Dockerイメージや他のスケジューラによって既に提供されているcronを重複して使用することはありません。

これらのチェックがすべて合格すれば、「タイマーが存在する」というだけでなく、systemdがジョブをスケジュールし、適切なアカウントでownCloudを起動し、実際のバックグラウンドジョブランナーを正常に完了させたことが確認されたことになります。

コメントを残す

ネットワーク上のデバイスを見つけるためのベスト10ピングスキャンツール

ネットワーク上のデバイスを見つけるためのベスト10ピングスキャンツール

迅速なLAN検出、クロスプラットフォームスキャン、IPアドレス管理のための10種類のpingスイープツールを比較します。スイープで何がわかるのか、何がわからないのかを理解しましょう。

パフォーマンス追跡に最適なネットワーク管理ツール6選

パフォーマンス追跡に最適なネットワーク管理ツール6選

SNMP対応範囲、マッピング、アラート、導入モデル、コストのトレードオフなど、パフォーマンス監視のための6つのネットワーク管理ツールを比較します。

Ping Monitor:ネットワーク可用性を確認するための7つの無料オープンソースツール

Ping Monitor:ネットワーク可用性を確認するための7つの無料オープンソースツール

フルネットワークスイートからレイテンシに特化したプローブまで、7つの無料オープンソースpingモニターを比較し、可用性、パケット損失、履歴など、ニーズに最適なものを選びましょう。

Windows、iOS、Android向けのおすすめWi-Fiアナライザー

Windows、iOS、Android向けのおすすめWi-Fiアナライザー

Windows、iPhone、Android向けのWi-Fiアナライザーのおすすめを比較検討しましょう。チャネルの混雑状況、信号カバレッジ、ヒートマップ、ネットワークのトラブルシューティングツールなどが含まれています。

安全なファイル転送のための最適なSFTPサーバーソフトウェア

安全なファイル転送のための最適なSFTPサーバーソフトウェア

WindowsおよびLinux向けの信頼性の高いSFTPサーバーソフトウェア(OpenSSH、Bitvise、SolarWinds、SFTPGoなど)を比較検討しましょう。セキュリティとファイル転送のニーズに最適なソフトウェアを見つけてください。

デバイスとIPアドレスを検出するためのベストネットワークスキャナーツール10選

デバイスとIPアドレスを検出するためのベストネットワークスキャナーツール10選

迅速なデバイス検出、クロスプラットフォームIPスキャン、エンタープライズIPAMを実現するネットワークスキャナーツールを比較し、それぞれのオプションをネットワークに合わせて選択するためのガイダンスを提供します。

ネットワークチーム向けのおすすめIPアドレス管理ツール7選

ネットワークチーム向けのおすすめIPアドレス管理ツール7選

サブネット検出、DNSとDHCPの連携、ネットワークインベントリ、オープンソースIPAMに対応した7つのIPアドレス管理ツールを比較します。

ネットワーク監視のベストプラクティス:追跡すべき項目と使用すべきツール

ネットワーク監視のベストプラクティス:追跡すべき項目と使用すべきツール

明確なデバイスカバレッジ、有用なパフォーマンス指標、実用的なアラート、そしてSolarWinds NPM、PRTG、OpManagerの比較機能を備えた、実用的なネットワーク監視システムを構築します。

デバイス、ホスト、トラフィックを監視するためのLinuxネットワーク監視ツール6選

デバイス、ホスト、トラフィックを監視するためのLinuxネットワーク監視ツール6選

SNMPデバイス検出、インターフェースグラフ、ホストメトリック、サービスチェック、トラフィックフローに関する6つのLinuxネットワーク監視ツールを比較します。

Nmapを使用してTracerouteを実行し、ネットワークパスを読み取る方法

Nmapを使用してTracerouteを実行し、ネットワークパスを読み取る方法

Nmapの--tracerouteオプションを使用すると、ホップを認証済みホストにマッピングし、ホップとRTTの出力を理解し、過剰なスキャンを行わずに応答の欠落をトラブルシューティングできます。