WordPressのコア更新で「別の更新が現在進行中です」と出て、更新が進まなくなったことがあります。原因は、前の更新が途中で止まったときに残るcore_updater.lockというロックでした。このロックには15分の期限があって、過ぎれば次の更新で上書きされるので、まずは15分ほど待ってからもう一度試してみてください。それでも消えないときは、ロックを削除すれば更新できるようになります。ローカル環境でハマったときの経緯と、WP-CLIがある場合・ない場合それぞれの対処法をまとめておきます。
- まず15分ほど待って、もう一度更新する
- メンテナンス画面のままなら、ドキュメントルート直下の
.maintenanceを削除する - それでも「別の更新が現在進行中です」が出るなら、
wp_optionsテーブルのcore_updater.lockを削除する
最初に出た症状:サイトが丸ごとメンテナンス画面に
予想外の展開でした。コア更新を実行した直後、サイトにアクセスすると「現在メンテナンス中です」という画面がずっと表示されたままになりました。普通、コア更新のメンテナンス表示は一瞬で終わるはずなので、明らかに様子がおかしいと感じました。
犯人は一時ファイルでした。調べてみると、WordPressはコア更新中、サーバーのドキュメントルート直下に.maintenanceという一時ファイルを作成し、更新が終わったタイミングで自動的に削除する仕組みになっています。今回はこのファイルが削除されないまま残ってしまっていて、それが原因でサイト全体がメンテナンス画面として扱われ続けていました。中身を見ると$upgrading = (タイムスタンプ);とだけ書かれたシンプルなPHPファイルで、これを手動で削除したところ、サイトはすぐに通常表示へ戻りました。
次に出た症状:「別の更新が現在進行中です」
油断は禁物でした。サイト自体は復旧したので、気を取り直してもう一度コア更新を実行しようとしたところ、今度は「別の更新が現在進行中です」という別のエラーで弾かれてしまいました。実際には更新プロセスなど動いていないはずなのに、です。
正体はロック用オプションでした。これはWordPressが更新の多重実行を防ぐために、core_updater.lockとauto_updater.lockというオプションをwp_optionsテーブルに一時的に保存する仕組みが原因でした。1つ目のメンテナンス画面のトラブルで更新プロセスが正常終了しなかったため、このロック用オプションだけが消えずに残ってしまっていたようです。
検索してもなかなか答えにたどり着けなかった
検索は空振りでした。実はこのトラブルに当たったとき、最初は普通に「WordPress 別の更新が現在進行中です」で検索していました。ただ出てくる記事の多くは「少し時間を置いてから再度お試しください」で終わっているものが多く、自分のケースのように何十分待っても直らないパターンの解決策にはなかなかたどり着けませんでした。当時は結局、WordPressコアのソースコードを直接読んで、更新処理がどのタイミングでどのオプションを読み書きしているかを追いかけることになりました。ただ、あらためてコードを確認すると、コア更新のロックには15分の期限があって、それを過ぎれば次の更新で上書きされます。なので本来は待てば直るはずで、何十分待っても消えなかったのは、ローカル環境側に別の要因が重なっていたのかもしれません。
対処法:.maintenanceとロック用オプションを削除する(WP-CLI)
頼れたのはWP-CLIです。WP-CLIが使える環境だったので、次の手順で復旧させました。
- ドキュメントルート直下の
.maintenanceファイルを削除する wp option delete core_updater.lockを実行するwp option delete auto_updater.lockを実行する- あらためて
wp core updateを実行する
ちなみに.maintenanceのほうも、作成から10分たつとWordPressが無視するようになっています。待てば表示が戻るケースも多いはずですが、急いでいるときは手動で消してしまうのが早いです。
地味な功労者、WP-CLI。この手順で無事にコア更新が完了しました。管理画面のUIだけで操作していたら、ロック用オプションの存在に気づくのはかなり難しかったと思います。DBの中身まで見に行けるWP-CLIのありがたみを感じた場面でした。
再発したときのために手順をメモ化しておいた
備えあれば憂いなしです。今回原因を突き止めるまでに結構な時間がかかってしまったので、次に同じ症状が出たときにすぐ動けるよう、社内的な備忘録(と言っても自分しかいないんですが)として手順を残すようにしました。個人開発だと、こういう「一度解決したはずのトラブル」を数ヶ月後にまた一から調べ直す羽目になりがちなので、地味ですが効果は大きいなと感じています。
本番環境ではなぜか発生しなかった
まさかの肩透かし。念のため本番のXserver環境でも同じ手順でコア更新を試したんですが、こちらは特に問題なく一発で更新が完了しました。同じWordPress・同じテーマ構成なのに再現しなかったので、おそらくローカルのMAMP環境特有の要因(更新処理の途中でPHPのタイムアウトや何らかの中断が発生した、など)が絡んでいたのではないかと推測しています。原因を完全に特定できたわけではないんですが、少なくとも対処法さえ分かっていれば慌てずに済むな、と感じました。
WP-CLIが使えない場合の対処法(FTPとphpMyAdmin)
代替手段もあります。今回はWP-CLIで一発でしたが、レンタルサーバーによってはSSHもWP-CLIも使えない環境もあると思います。その場合でも、FTP/SFTPでドキュメントルート直下の.maintenanceファイルを削除するところまでは同じようにできます。ロックオプションの削除については、phpMyAdminなどのDB管理ツールからwp_optionsテーブルを開き、option_nameがcore_updater.lockまたはauto_updater.lockの行を直接削除すれば、同じ効果が得られるはずです。管理画面のUIだけで完結しないぶん少し身構える作業ではありますが、手順さえ分かっていれば怖くはないかなと思います。
まとめ:「別の更新が現在進行中です」は更新の中断で残ったロックが原因
原因はどちらも同じでした。「メンテナンス画面から戻ってこない」「別の更新が進行中と言われる」のどちらも、実際には更新プロセスが正常終了しなかった名残りが原因でした。同じ症状に遭遇した人の助けになればと思い、原因と対処法をまとめておきます。管理画面から直せない類のエラーに当たったときは、DBのオプションテーブルまで疑ってみる価値がありそうです。
