NextcloudにおけるWebHosting(レンタルサーバ)さんのプロセスkillとの戦い

Nextcloudに先月デビューしました。
お金が無いのでWebHosting(レンタルサーバ)さんでの稼働を試みてます(ご迷惑をおかけいたします)。

("Cheapest mass storage VPS"で検索。6ユーロ(約900円強)、14GB(SSD), 2TB(HDD)ってのが最安だった(2025.01)。最悪それに移ることになりますが、お金/時間なくて、レンタルサーバで使わせて頂けないか試行錯誤。)

# 問題の発覚
NextCloudが「Some jobs have not been executed since 1ヶ月前. Please consider increasing the execution frequency.」と提示。webcronを実行しているはずなのに原因がわからなかった。

# NextCloudのタスクは多すぎ

- 概要: **『uploadしたファイルのmetaデータ抽出もtaskとなる」**。しかも、1ファイル/1タスク。

私はNextcloudのタスクが多いことを想像できてなかった。

- `php occ background-job:list`はタスクを一覧できる、実行したら、

下記通り、左TaskIDが万単位のタスクはどうやらUploadしたファイルの検索等用のメタデータを更新する処理みたい。つまり、uploadしたファイル毎にメタデータ生成taskを実施しないといけない。レンタルサーバですので、cron.phpを長時間処理するとKilledされる。処理終わらない。
```
| 41    | OC\Preview\BackgroundCleanupJob                                   | 2025-01-18T04:51:28+00:00 | null               |
| 42    | OC\TextProcessing\RemoveOldTasksBackgroundJob                     | 2025-01-18T04:51:29+00:00 | null               |
| 43    | OC\User\BackgroundJobs\CleanupDeletedUsers                        | 2025-01-18T04:51:31+00:00 | null               |
| 97    | OCA\Money\BackgroundJob\CleanupDatabase                           | 2025-01-18T02:16:10+00:00 | null               |
| 22584 | OC\FilesMetadata\Job\UpdateSingleMetadata                         | 1970-01-01T00:00:00+00:00 | ["your_id",37335] |
| 22585 | OC\FilesMetadata\Job\UpdateSingleMetadata                         | 1970-01-01T00:00:00+00:00 | ["your_id",37336] |
| 22586 | OC\FilesMetadata\Job\UpdateSingleMetadata                         | 1970-01-01T00:00:00+00:00 | ["your_id",37337] |
(ずっと続く....)
```

つまり、頻繁にcronしないと未Task蓄積してしまう仕様にもかかわらず、レンタルサーバ側はそれをゆるしてくれない(当然である、高負荷は死活問題である。低価格で提供してくださっているのだから仕方ない）。

`nice -19`やらタイムアウト時間やら私のレンタルサーバは無意味。

# WebCronはシステムcronと同等と思い違いしました

確認不足かなのかもしれないが、NextCloud(現在ver30.0.5)の各cronの挙動
1. Ajax: Task1つ処理/ページ読み込み
1. WebCron: 同上(と見えた)←←★後述のタスク一覧で1つずつしか減ってないのを確認。
    1. [バックグラウンドジョブ](https://docs.nextcloud.com/server/30/admin_manual/configuration_server/background_jobs_configuration.html)に明記されていた、下記に内容を記します。
    1. 「WebCron が 5 分ごとに呼び出されると、インスタンスは 1 日あたり 288 のバックグラウンド ジョブに制限されますが、これは非常に小さなインスタンスにのみ適しています。」→よほどUploadファイル数が少なくなければ飽和してしまうよね。。。
1. (ローカル)cron: 指定間隔を超えた全タスク実行

問題は、WebCronは、1Taskの処理が終わると終了している模様。

別のCMSでは、WebCronを選んでもローカルCronと同等の処理していたので、WebCron==ローカルcronであると思い込んでいた。間違いだった。

しかし、レンタルサーバさんは5分事にローカルcronを実行してくれない、ローカルcronを10までしか登録できない仕様。もっとプロセス存続時間が長寿でないと実行終えない。なのでWebCronを実行してたが、1回の呼び出しで1Taskしか実施されない。これがcron未処理タスクを飽和していた根本原因だった模様。

## 未整理
1. cron.phpは何も標準出力しないので、正しく処理できているか不明、出力する方法ご存知ならお教え願います。
    1. `php -vvv cron.php`でも無口なcron.phpさん。。。

## まとめ
1. NextCloudはレンタルサーバさんのcron.phpをkilledは想定されてない仕様(みたい)
1. **『すべてのcron(Axjx, webcron, local cron)が同時に使えてほしいのに排他的にしか使えない』**
    1. Nextcloudのcronは選択したcronしか実行を受け付けない。モード切り替えが必要
1. **Uploadしたファイル1つに付き、メタ印加Taskが発生。沢山のファイルアップロードするとレンタルサーバではTask処理が間に合わない**
1. cron.phpがKillされるとWebインタフェース上(ttps://your_nextcloud/index.php/settings/admin)ではTask処理されたとみなされないみたい。cron.phpを実施してもKillされると、「最終ジョブ実行は ??分前 です。何か問題が発生しています。」と**『cron.phpが未実施のように表示される→心配で調べ時間取られる』**

## 解決策

### [通常]レンタルサーバさんのcronの上限いっぱいにcron.phpの実行を登録させてもらう。
1. 毎分実行無理なWebインタフェースなら、10分毎に6個のジョブ作成



### [未処理タスク飽和下] 一つひとつTask実施
#### WebCronの代わりに手動/スクリプトでひたすらhttp(s)経由でcron.phpを実行。

#### 母艦PCからSSHでタスク残量確認して、リモートTask実施、残量一定以下で終了する方法
1. 下記処理を実施。Killedを検出して、再実行。処理必要タスクがなくなるまで実施
1. (パターン1)SSh+occコマンドでWebCronモードに切り替え。http(s)経由でcron.phpを実行。定期的にTask残り#### 確認して一定以下になったら終了。Webサーバ経由なのでKilledされにくいと思われる。
1. (パターン2)パターン1のhttp経由でcron.phpを実行する代わりにoccコマンドでタスク実行。
1. (私は未完): SSH経由で`php cron.php`の実行。Killedされたのをうまく検出せずに母艦PCのrunが落ちる。すると、local cronモードへ戻せない、など問題あり。


以上。