tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

【mac】macでポート(port)を使用しているプロセス(pid)を調べる - 例) goapp serve

はじめに

localなmacで開発をしているとたまに既にport使用してるから立ち上げられんで!みたいなエラーがでる事があります。
そんなときにプロセスを調べるメモ

調べ方

先んじて結論ですが、lsof で調べます。
8080を使っているプロセスを知りたい時のコマンドです

sudo lsof -P -i:8080

こんな時 例

今回の例ですが、ポートを指定してlocalにサーバを立ち上げる とします。
もうちょっと具体的にすると、localなmacgolang 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 "borr" 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でも比較的よく使いますがオプション忘れては調べてるので備忘録的に書きました!