ポート番号に紐づくプロセスを表示して、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