Next.js をローカルで起動した時に`Unable to acquire lock`が出たら読む記事
Next.jsのローカル開発、複数PJを同時並行で進めたりしているとたまにUnable to acquire lockエラーに遭遇することがあります。毎回調べている気がしたので、簡単にまとめました。 発生したエラー エラ […]
目次
Next.jsのローカル開発、複数PJを同時並行で進めたりしているとたまにUnable to acquire lockエラーに遭遇することがあります。毎回調べている気がしたので、簡単にまとめました。
発生したエラー
エラーはnpm run devなどで開発サーバーを起動する時に発生します。
npm run dev
> [email protected] dev
> next dev
⚠ Port 3000 is in use by process 71348, using available port 3001 instead.
⨯ Unable to acquire lock at /Users/okamotohidetaka/development/.next/dev/lock, is another instance of next dev running?
Suggestion: If you intended to restart next dev, terminate the other process, and then try again.
ポートがすでに使われているから別のものを使おうとするのはわかります。ただ、その後.next/dev/lock を使えなくて起動できないというエラーまで発生しています。他にプロセスが走っているならば、止めてくださいと書かれているのですが、ターミナルを見てもそれらしいタブは見当たりませんでした。
Next.jsの開発サーバーは、複数起動できない(らしい)
Claudeに調べさせて対処を進めたのですが、どうも複数プロセスでnext devを実行されないようにするためのロックファイルだそうです。ということは過去に行った開発の際にnext devが何かしらの理由、例えばクラッシュやシステムのダウンなどですかね、が起きたことでクリーンナップがされなかった可能性が考えられます。
調査と対応方法
原因がざっくり分かれば、あとは対応するだけです。要はクリーンナップできてないnext devプロセスの停止ができればよさそうです。
まず、Next.js の開発サーバーが実行中かどうかを確認しましょう。
ps aux | grep "next dev" | grep -v grep
もし本当にプロセスが残っているならば、以下のようなログが出ます。
okamotohidetaka 45270 0.0 0.0 432902576 608 ?? SN 9Dec25 0:00.18 node /Users/.../node_modules/.bin/next dev
2つ目の項目がプロセス ID なので、これが 45270 であることがわかります。あとは見つかったプロセス ID を使ってプロセスを終了させましょう。
kill 45270
プロセスが応答しない場合は、強制終了を試みます。
kill -9 45270
プロセスを終了した後、念の為プロジェクトディレクトリでロックファイルを削除します。
rm -f .next/dev/lock
とりあえずこれで動くようになるはずです。
完全にクリーンアップしてしまう代替案
上記の手順でも問題が解決しない場合、.next ディレクトリ全体を削除することもできます。削除後に再ビルドさせることで、復旧を試みます。
まとめ
next devの同時複数実行を阻止する仕組みがNext.jsには用意されている様子です。そのため、next devのプロセスが正常終了できなかった場合には、プロセスまたはロックファイルが残っていることが原因によるエラーが発生する可能性があります。
とはいえ解決策はシンプルで、止まれてないプロセスやクリーンナップできてないファイルを掃除するだけでOKです。