NodeやGulpでhost: "0.0.0.0" を指定してサーバーを立ち上げたとき、 listen EADDRINUSE というエラーが出た場合の対応
環境
- macbook Pro(ElCapitan)
- node: v6.9.2
- gulp cli: 3.9.0
- npm: 4.0.5
状況
gulp.task("webserver.dev", () => { gulp.src("hoge") .pipe(webserver({ host: "0.0.0.0", livereload: true, port: 8080 })); });
通常これでの目的は適う様なのですが、今回は以下のエラーがでました。
listen EADDRINUSE 0.0.0.0:8080 listen EADDRINUSE 0.0.0.0:35729
悲しいことに livereloadの方も でした
原因
のエラーはこのIP, Portは使われていますよということですので、実際に確認します。
netstat
コマンドなど普段の開発フローでサーバーが立ち上がっていないことを確認します。
netstat -an
をします。
するとtcp4でみたくないものを発見しました
tcp4 0 0 *.8080 *.* LISTEN tcp4 0 0 *.35729 *.* LISTEN
ポートの8080と35729がLISTEN状態のままでした。
おそらく、立ち上げたサーバーが、開発中の何らかの理由で、ちゃんと終了されなかったということにあると思います。
対応
この問題の解決方法はいくつかあると思います。
- 別のPortを振ってあげる(暫定的な対応)
- このIP/Portを使っているプロセスをkillして、開放する
1をやっても、同じ問題が繰り返されるだけの可能性もあるので、今回は2の方法をとります。
上のPIDを探る
PIDが分かればkillすることが出来ます。(おそらく) なので、以下のコマンドをとります。
$ lsof -n -P -i :8080
するとPIDが表示されると思います。
追記
netstatでもPIDを表示できるようです。
root権限があるのであればnetstatコマンドでも-pオプションでPIDとプログラム名が表示できます。
PIDをkillする
kill {PID}
してあげればOKです。
参考までに
nodeが犯人であることが多い様です
nodeがポートを保持し続けてしまうことが原因であることが多いようです。 なので
ps aux | grep node | grep -v grep
とかしてあげると、nodeのプロセスが出てきます。 動かしているはずがないのに、生きているプロセスがあったらそいつを殺してあげるといいです。
electron系のアプリはnodeをバンバンつかっています
なお、slackアプリなどを使っている場合は、nodeのプロセスがたくさん立ち上がっていると思いますので、 killall node
はしないほうがいいと思います。
私の場合には Nginx が犯人でした
nginxでリバースプロキシをmac内に立ち上げていたのですが、そいつが悪さををしていました。nginxが正しく動いていなかったことが問題だったようです。
これも netstat
や ps
で探っていったらなんとかなりました。