うちのいぬ Tech Blog

Tech Blog of Uchinoinu/My dog

NodeやGulpでhost: "0.0.0.0" を指定してサーバーを立ち上げたとき、 listen EADDRINUSE というエラーが出た場合の対応

qiita.com

環境

状況

  • 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状態のままでした。

おそらく、立ち上げたサーバーが、開発中の何らかの理由で、ちゃんと終了されなかったということにあると思います。

対応

この問題の解決方法はいくつかあると思います。

    1. 別のPortを振ってあげる(暫定的な対応)
    1. この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が正しく動いていなかったことが問題だったようです。 これも netstatps で探っていったらなんとかなりました。

References