はじめに
localなmacで開発をしているとたまに既にport使用してるから立ち上げられんで!
みたいなエラーがでる事があります。
そんなときにプロセスを調べるメモ
調べ方
先んじて結論ですが、lsof
で調べます。
8080を使っているプロセスを知りたい時のコマンドです
sudo lsof -P -i:8080
例
こんな時 例
今回の例ですが、ポートを指定してlocalにサーバを立ち上げる
とします。
もうちょっと具体的にすると、localなmacでgolang x appengine
の開発を行おうとしている、という例として進めます。
goapp serve hoge.yaml
はlocalにサーバを立ち上げますが、
これはデフォルトで8080
ポートを使用します。
いざ立ち上げようと思ったらこんなエラーが出ました。
$ goapp serve hoge.yaml INFO 2017-08-07 07:57:54,539 devappserver2.py:764] Skipping SDK update check. INFO 2017-08-07 07:57:54,602 api_server.py:268] Starting API server at: http://localhost:62294 INFO 2017-08-07 07:57:54,606 api_server.py:700] Applying all pending transactions and saving the datastore INFO 2017-08-07 07:57:54,606 api_server.py:703] Saving search indexes Traceback (most recent call last): File "/usr/local/Cellar/app-engine-go-64/1.9.48/share/app-engine-go-64/dev_appserver.py", line 101, in <module> _run_file(__file__, globals()) File "/usr/local/Cellar/app-engine-go-64/1.9.48/share/app-engine-go-64/dev_appserver.py", line 97, in _run_file execfile(_PATHS.script_file(script_name), globals_) File "/usr/local/Cellar/app-engine-go-64/1.9.48/share/app-engine-go-64/google/appengine/tools/devappserver2/devappserver2.py", line 1041, in <module> main() File "/usr/local/Cellar/app-engine-go-64/1.9.48/share/app-engine-go-64/google/appengine/tools/devappserver2/devappserver2.py", line 1029, in main dev_server.start(options) File "/usr/local/Cellar/app-engine-go-64/1.9.48/share/app-engine-go-64/google/appengine/tools/devappserver2/devappserver2.py", line 825, in start options.grpc_apis) File "/usr/local/Cellar/app-engine-go-64/1.9.48/share/app-engine-go-64/google/appengine/tools/devappserver2/dispatcher.py", line 196, in start _module.start() File "/usr/local/Cellar/app-engine-go-64/1.9.48/share/app-engine-go-64/google/appengine/tools/devappserver2/module.py", line 1198, in start self._balanced_module.start() File "/usr/local/Cellar/app-engine-go-64/1.9.48/share/app-engine-go-64/google/appengine/tools/devappserver2/wsgi_server.py", line 330, in start self._start_all_fixed_port(host_ports) File "/usr/local/Cellar/app-engine-go-64/1.9.48/share/app-engine-go-64/google/appengine/tools/devappserver2/wsgi_server.py", line 367, in _start_all_fixed_port raise BindError('Unable to bind %s:%s' % self.bind_addr) google.appengine.tools.devappserver2.wsgi_server.BindError: Unable to bind localhost:8080 error while running dev_appserver.py: exit status 1
Unable to bind localhost:8080
とあるのでポートがすでに使われている可能性はあるもののterminal上どこでも立ち上げてる形跡はない...という状況です。
そのときのコマンド例
8080を使用しているプロセスを調べます。
$ sudo lsof -P -i:8080 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME Python 58645 hoge 11u IPv6 0x51abc044e9105fdb 0t0 TCP localhost:8080 (LISTEN) Python 58645 hoge 12u IPv4 0x51abc044e8ae2963 0t0 TCP localhost:8080 (LISTEN)
このプロセスに思い当たりがなければ思い切ってkillします。
$ sudo kill -9 58645 58645
再度立ち上げてみると無事立ち上がりました。めでたし
$ goapp serve local_production.yaml INFO 2017-08-07 08:47:58,533 devappserver2.py:764] Skipping SDK update check. INFO 2017-08-07 08:47:58,611 api_server.py:268] Starting API server at: http://localhost:62971 INFO 2017-08-07 08:47:58,616 dispatcher.py:199] Starting module "hoge" running at: http://localhost:8080 INFO 2017-08-07 08:47:58,621 admin_server.py:116] Starting admin server at: http://localhost:8000 WARNING 2017-08-07 08:47:58,621 devappserver2.py:836] No default module found. Ignoring.
オプション
申しわけ程度にlsofのオプションです。
オプション | 説明 |
---|---|
-c | プロセス名を指定する |
-i | ネットワークソケットファイルを表示する |
-n | IPアドレスを表示する(名前解決しない) |
-p | プロセスIDを指定する |
-P | ポート番号をサービス名に変換しない |
おわり
lsofはlinuxでも比較的よく使いますがオプション忘れては調べてるので備忘録的に書きました!