環境
- macbook Pro(ElCapitan)
- node: v6.9.2
- gulp cli: 3.9.0
- npm: 4.0.5
状況
- GulpやNodeでサーバーを立ち上げますが、同じローカルネットワーク内の別端末(スマホとか)からもデバッグのために閲覧したいのでgulpflieを以下の様にしました。
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
で探っていったらなんとかなりました。