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.rb
, je reçois un message d'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>'
vous devez utiliser kill -9 59780
(utilisez lsof -wni tcp:3000
pour voir quel processus utilisé 3000
port et obtenir le pid du processus)
ou vous modifiez simplement votre configuration puma, changez le port TCP tcp://127.0.0.1:3000
de 3000
en 9292
ou 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
Pour tuer le processus de puma première exécution
lsof -wni tcp:3000
pour montrer ce qui utilise le port 3000. Utilisez ensuite 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 obtiendrez peut-être 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)
Maintenant, exécutez ce qui suit pour tuer le processus. (où 3366 est le PID)
kill -9 3366
Devrait résoudre le problème
vous pouvez aussi 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]
ensuite:
kill 67661
Trouvé le script ci-dessous dans ce numéro de github . Ça marche 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 soit l'exécuter dans irb ou dans un fichier Ruby.
Pour ce dernier, créez server_killer.rb
puis exécutez-le avec Ruby server_killer.rb
Si les solutions ci-dessus ne fonctionnent pas sur Ubuntu/Linux, vous pouvez essayer ceci
Sudo fuser -k -n tcp port
Lancez-le plusieurs fois pour tuer les processus sur votre port de choix. le port pourrait être 3000 par exemple. Vous auriez tué tous les processus si vous ne voyez aucune sortie après avoir exécuté la commande