LoginSignup
3
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-02-03

環境

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

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

対応

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

  • 1. 別のPortを振ってあげる(暫定的な対応)
  • 2. この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

3
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1