👋

ポート番号に紐づくプロセスを表示して、killする

に公開

特定のポートが使われていて、アプリケーションが起動できなかったという現象によく遭遇するので、対処法をまとめておきます。

主に、IntelliJを閉じた際にアプリケーションがTerminateできてない時や、シンプルに別のアプリケーションを起動してしまっているなどの事象です。
初歩的な問題なのですが、ちょいちょい遭遇します。

ポート番号に紐づくプロセスを表示するコマンド

例えば、8080番ポートで稼働しているプロセスを確認したい場合、lsofコマンドを使用します。

以下のように -iオプションをつけて、ポート番号を指定して実行すれば表示されます。

lsof -i:8080

COMMAND    PID   USER   FD    TYPE  DEVICE             SIZE/OFF NODE NAME
com.docke  4435  user   161u  IPv6  0xb000000000000000 0t0      TCP  *:8080 (LISTEN)
com.docke  4435  user   193u  IPv6  0xb000000000000000 0t0      TCP  localhost:8080->localhost:81805 (ESTABLISHED)

上記のうち PID の列に表示されているのが、プロセスの番号です。

なお、lsofは list open files の略称です。
オープンしているファイルやファイルをオープンしているプロセスのリストを出力するコマンドです。

プロセスを終了するコマンド

lsofコマンドでプロセスを特定できたので、いよいよこいつをkillします。

kill 4435

kill プロセスIDで実行すれば、該当のPIDに紐づくプロセスを終了させることができます。

エラーがでなければ、基本問題なく終了されているとは思いますが、不安な場合はlsof -i:portNumberで何も表示されなければ成功しています。

まとめ

今回は特定のポート番号に紐づく、プロセスの終了方法を解説しました。

kill,lsofコマンド自体の詳細な使い方や情報は記載していませんので、他の情報ソースから確認してみてください。

番外編

地味にハマった現象を紹介します。アプリケーションで5000番ポートを使用しており、起動するとお決まりの以下のメッセージが表示されました。
Error response from daemon: Ports are not available: listen tcp 0.0.0.0:5000: bind: address already in use

あーはいはい、5000ポートのプロセスをkillして、アプリケーション再起動するかと対応するとなぜか再び同じメッセージが表示されました。

Error response from daemon: Ports are not available: listen tcp 0.0.0.0:5000: bind: address already in use

え、なんで?と思い、lsofコマンドで5000番ポートを確認すると、別のPIDのプロセスが立ち上がっていました。
その後、数回繰り返しても同じ現象が起きたので、ググってみたところMacの設定が悪さしてました。

どうも Mac の Airplay の機能により5000番ポートが占拠されてしまっていたようでした。
Mac の System Preference の Sharing から AirPlay Receiver のチェックを外せば完了です。

あまり遭遇することはないとは思いますが、対応策の紹介しました。

Discussion