Adresse déjà utilisée - bind (2) (Errno :: EADDRINUSE)

130

J'essaie de déployer l'application Rails avec le serveur Web Puma. En essayant de démarrer le serveur Puma avec un fichier de configuration, bundle exec puma -C config/puma.rbj'obtiens une erreur indiquant que l'adresse est déjà utilisée.

Est-ce que quelqu'un sait comment résoudre ce problème?

bundle exec puma -C config/puma.rb
[23699] Puma starting in cluster mode...
[23699] * Version 2.11.3 (ruby 2.0.0-p353), codename: Intrepid Squirrel
[23699] * Min threads: 5, max threads: 5
[23699] * Environment: development
[23699] * Process workers: 2
[23699] * Preloading application
Jdbc-MySQL is only for use with JRuby
[23699] * Listening on tcp://0.0.0.0:3000
/.rvm/gems/ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/binder.rb:210:in `initialize': Address already in use - bind(2) (Errno::EADDRINUSE)
    from /.rvm/gems/ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/binder.rb:210:in `new'
    from /Users/lexi87/.rvm/gems/ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/binder.rb:210:in `add_tcp_listener'
    from /.rvm/gems/ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/binder.rb:96:in `block in parse'
    from /.rvm/gems/ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/binder.rb:82:in `each'
    from /.rvm/gems/ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/binder.rb:82:in `parse'
    from /.rvm/gems/ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/runner.rb:119:in `load_and_bind'
    from /.rvm/gems/ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/cluster.rb:302:in `run'
    from /.rvm/gems/ruby-2.0.0-p353/gems/puma-2.11.3/lib/puma/cli.rb:216:in `run'
    from /rvm/gems/ruby-2.0.0-p353/gems/puma-2.11.3/bin/puma:10:in `<top (required)>'
    from /.rvm/gems/ruby-2.0.0-p353/bin/puma:23:in `load'
    from /.rvm/gems/ruby-2.0.0-p353/bin/puma:23:in `<main>'
    from /.rvm/gems/ruby-2.0.0-p353/bin/ruby_executable_hooks:15:in `eval'
    from /.rvm/gems/ruby-2.0.0-p353/bin/ruby_executable_hooks:15:in `<main>'
Cornelius Wilson
la source
1
c'est exactement ce qu'il dit. quelqu'un utilise déjà le port 3000. utilisez netstat pour savoir qui est sur le port 3000
Mircea
4
Quand j'essaye de le tuer, j'obtiens une erreur kill -59780 PID. Me dit invalid signal specification. J'avais l'habitude lsof -wni tcp:3000de montrer ce qui utilise le port 3000.
Cornelius Wilson
1
kill -9 59780 (donc "kill -9 pid_id" en général)
Mircea

Réponses:

288

Vous devez utiliser kill -9 59780avec 59780remplacé par le numéro PID trouvé (utilisez lsof -wni tcp:3000pour voir quel processus a utilisé le 3000port et obtenir le PID de processus).

Ou vous pouvez simplement modifier votre configuration puma changer le port TCP tcp://127.0.0.1:3000de 3000vers 9292ou un autre port qui n'a pas été utilisé.

Ou vous pouvez démarrer votre application rails en utilisant:

bundle exec puma -C config/puma.rb -b tcp://127.0.0.1:3001
Zoker
la source
Merci pour cette réponse. J'ai eu la même erreur avec OP. et ce que j'ai réalisé, c'est que je fais déjà rails ssur un autre terminal. C'est pourquoi j'ai eu cette erreur. puis j'ai utilisé le port diff pour démarrer le serveur rails s -p 9090
Fai Zal Dong
129

Pour tuer le processus puma, exécutez d'abord

    lsof -wni tcp:3000 

pour montrer ce qui utilise le port 3000. Ensuite, utilisez le PID fourni avec le résultat pour exécuter le processus de suppression.

Par exemple, après avoir exécuté lsof -wni tcp: 3000, vous pourriez obtenir quelque chose comme

    COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    ruby    3366 dummy    8u  IPv4  16901      0t0  TCP 127.0.0.1:3000 (LISTEN)

Exécutez maintenant ce qui suit pour arrêter le processus. (où 3366 est le PID)

kill -9 3366

Devrait résoudre le problème

Sawo Cliff
la source
Merci @ sawo-cliff cela a résolu mon problème J'ai eu une autre application fonctionnant sur le port 3000.
Nomis
3
Comment cette réponse ajoute-t-elle plus d'informations que celle acceptée il y a un an?
Andre Figueiredo
1
@AndreFigueiredo, je ne suis pas tout à fait sûr de suivre votre question, mais du peu que je peux en tirer, ma réponse a ajouté comment savoir quel processus ID est en cours d'exécution afin de savoir quoi tuer.
Sawo Cliff
Oui. Je peux voir maintenant que la réponse originale a inclus les mêmes informations. Mais je n'ai pas bien compris ce que je devais faire avant de lire cette version.
Jeff Zivkovic
28

vous pouvez également essayer cette astuce:

ps aux | grep puma

exemple de sortie:

myname           77921   0.0  0.0  2433828   1972 s000  R+   11:17AM   0:00.00 grep puma
myname           67661   0.0  2.3  2680504 191204 s002  S+   11:00AM   0:18.38 puma 3.11.2 (tcp://localhost:3000) [my_proj]

puis:

kill 67661
ana
la source
Utilisez kill -9 67661if kill 67661ne tue pas réellement le processus pour vous (comme dans l'exemple ci-dessus). Cela a fonctionné pour moi! À votre santé!
William Hampshire
3

J'ai trouvé le script ci-dessous dans ce numéro de github . Fonctionne très bien pour moi.

#!/usr/bin/env ruby
port = ARGV.first || 3000
system("sudo echo kill-server-on #{port}")

pid = `sudo lsof -iTCP -sTCP:LISTEN -n -P | grep #{port} | awk '{ print $2 }' | head -n 1`.strip
puts "PID: #{pid}"
`kill -9 #{pid}` unless pid.empty?

Vous pouvez l'exécuter dans irb ou dans un fichier ruby.

Pour ce dernier, créez-le server_killer.rbpuis exécutez-le avecruby server_killer.rb

Flavio Wuensche
la source
Cela a fonctionné pour moi merci, mais j'ai sorti le sudo, car je ne semblais pas en avoir besoin.
Obromios
1

Vous pouvez trouver et tuer les processus en cours: ps aux | grep puma Ensuite, vous pouvez le tuer aveckill PID

Ali
la source
0

Si les solutions ci-dessus ne fonctionnent pas sur ubuntu / linux, vous pouvez essayer ceci

sudo fuser -k -n tcp port

Exécutez-le plusieurs fois pour tuer les processus sur le port de votre choix. le port pourrait être 3000 par exemple. Vous auriez tué tous les processus si vous ne voyez aucune sortie après l'exécution de la commande

Nsoseka
la source