3000ポートがすでに使われている
1.問題 bun run dev を実行するとエラーが発生した
コマンドラインから bun を実行
bun run dev
を実行すると
> bun run dev
$ bun run --hot src/index.tsx
17 | }, reportError);
18 | } else if (typeof entryNamespace?.default?.fetch === 'function') {
19 | var server = globalThis[hmrSymbol];
20 | if (server) {
21 | server.reload(entryNamespace.default);
22 | server = globalThis[hmrSymbol] = Bun.serve(entryNamespace.default);
^
EADDRINUSE: Failed to start server. Is port 3000 in use?
syscall: "listen"
at bun:main:22:49
17 | }, reportError);
18 | } else if (typeof entryNamespace?.default?.fetch === 'function') {
19 | var server = globalThis[hmrSymbol];
20 | if (server) {
21 | server.reload(entryNamespace.default);
22 | server = globalThis[hmrSymbol] = Bun.serve(entryNamespace.default);
^
EADDRINUSE: Failed to start server. Is port 3000 in use?
syscall: "listen"
EADDRINUSE: Failed to start server. Is port 3000 in use?
翻訳
EADDRINUSE: サーバーの起動に失敗しました。ポート3000は使用中ですか?
3000ポートが既に使われていて起動できないようだ
2.3000ポートをどのプログラムが塞いでいるのか?
コマンドプロンプトから確認する方法
netstat -ano
で確認
PS C:\> netstat -ano
アクティブな接続
プロトコル ローカル アドレス 外部アドレス 状態 PID
TCP 0.0.0.0:22 0.0.0.0:0 LISTENING 5968
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1644
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4
~~~
表示量が多すぎるので findstr
を使って絞り込む
netstat -ano | findstr :3000
PS C:\> netstat -ano | findstr :3000
TCP 0.0.0.0:3000 0.0.0.0:0 LISTENING 5968
今回はPIDが 5968 のプログラムがポートを使用している
- タスクマネージャーから確認してみる
Ctrl+Shift+Esc キーを押してタスクマネージャー を開きます。
[タスクマネージャー]から[詳細] PIDでソートする
svchost.exe とは、
Windows NT 系オペレーティングシステムにおいて、複数の Windows サービスをホストするシステムプロセスです。
svshost 自体がポートを使用するプログラムではないので、svshostを使用しているプログラムを探す
ポートを使用しているプログラムは?
普通のプログラムがポートを使用しているのであれば
- 右クリック、プロパティを表示
- プログラムの情報が表示される
- プログラムを終了させる
今回の svcHost.exe は何によって起動されているのか?
iphlpsvc 5968 IP Helper が起動中
- iphlpsvc ってなんだろう?
Windowsのiphlpsvcとは?
iphlpsvc は、Windowsのシステムサービスの一つで、正式名称は「IP Helper」サービスです。このサービスは、ネットワーク設定の管理を支援し、様々なネットワークプロトコル(IPv6、ポートプロキシなど)間の接続を円滑にする役割を果たしています。
どうやら、このプログラムが直接起動して,ポートを使っているわけではなさそうだ
別のアプローチを探す
3.別解を求める 3000ポート って開発でよく使うポートだよな?
wslで起動させたサーバーに外部からアクセスするにはポートプロキシが必要だったので、
-
[【WSL2】外部からWSL2のサービスに接続する] のPowerShellスクリプトを管理者権限で実行していた
-
ただし、再起動すると設定は消えてしまうので必要になった都度実行していた
ポートプロキシが残っているか確認してみる(ポートがどうなっているか確認)
netsh interface portproxy show all
PS C:\> netsh interface portproxy show all
ipv4 をリッスンする: ipv4 に接続する:
Address Port Address Port
--------------- ---------- --------------- ----------
* 22 172.22.0.1 22
* 3000 172.22.0.1 3000
* 3001 172.22.0.1 3001
* 8080 172.22.0.1 8080
* 38585 172.22.0.1 38000
なぜか 3000ポートが wsl に接続されていた
以前は、再起動すると設定が消えていたのに(いつの間にか設定が残るようになった?)
wsl側でもポートが使用中か確認
sudo lsof -i:3000
# または
sudo ss -tulpn | grep :3000
wsl側では 3000 ポートを使用していなかった
ポートプロキシ設定が行われていると、wslでポートを使っていなくてもポートが使用中となる
先に押さえられているので、それは使えないですね
とりあえず、削除
管理者権限のPowerShellから
netsh interface portproxy delete v4tov4 listenaddress=* listenport=3000
bun を実行する
コマンドラインから bun を実行
bun run dev
を実行する
> bun run dev
$ bun run --hot src/index.tsx
Started server http://localhost:3000
原因
いつの頃からかポートプロキシ設定が再起動しても消えなくなっていた
以前は起動するたびに、管理者権限のPowerShellでポートプロキシを設定しなければいけなかったのに、いつの間にかポートプロキシの設定を記憶するようになっていた。