Le serveur Rails dit que le port est déjà utilisé, comment tuer ce processus?

275

Je suis sur un Mac et je fais:

rails server

Je reçois:

2010-12-17 12:35:15] INFO  WEBrick 1.3.1
[2010-12-17 12:35:15] INFO  ruby 1.8.7 (2010-08-16) [i686-darwin10.4.0]
[2010-12-17 12:35:15] WARN  TCPServer Error: Address already in use - bind(2)
Exiting

Je sais que je peux en démarrer un sur un nouveau port, mais je veux tuer ce processus.

Blankman
la source

Réponses:

694

En supposant que vous cherchez à tuer tout ce qui se trouve sur le port 3000 (qui est normalement utilisé par webrick), saisissez ceci dans votre terminal pour connaître le PID du processus:

$ lsof -wni tcp:3000

Ensuite, utilisez le numéro dans la colonne PID pour tuer le processus:

$ kill -9 PID
paresseux
la source
4
pourriez-vous s'il vous plaît expliquer -wni
user993563
53
Juste pour clarifier pour les novices: dans la deuxième ligne de code, vous êtes censé remplacer le PIDpar le numéro réel qui est affiché dans votre console lors de la saisie de la première ligne de code (par exemple, 12345).
CodeBiker
5
Vous pouvez également trouver le PID en naviguant dans votre répertoire rails vers le fichier suivant tmp / pids / server.pid
tandy
Cela peut arriver si vous exécutez le débogueur dans RubyMine et qu'il se bloque ou quelque chose ... Le serveur s'arrête mais le débogueur continue ... Quoi qu'il en soit, c'est la solution que j'ai utilisée et cela fonctionne parfaitement :)
J Smith
@tandy c'est un bon moyen d'obtenir le PID pour un projet spécifique cependant, parfois lorsqu'un processus se ferme soudainement, le fichier peut être absent mais le serveur peut toujours être en cours d'exécution. Faire un lsof -wni tcp:3000sera toujours montrer tous les processus d' écoute sur ce protocole: combinaison de port. (où 3000 doit être remplacé par le port de votre serveur local. Par exemple, dans Rails, c'est 3000 par défaut).
SidOfc
125

kill -9 $(lsof -i tcp:3000 -t)

Bijan
la source
3
tout entre les parenthèses renverra un identifiant de processus utilisant le port 3000. Et cela -tsignifie specifies that lsof should produce terse output with process identifiers only and no header - e.g., so that the output may be piped to kill(1).que je suppose que vous savez ce qui killva faire
Papouche Guinslyzinho
Cela devrait être la réponse acceptée car il s'agit d'une ligne «tout en un». Mettez cela dans un alias et vous êtes prêt à partir.
Nubtacular
Si une explication était incluse, cela mériterait certainement un vote positif.
mwfearnley
2
Cela tuera tous les processus, y compris toutes les sessions de navigateur ouvertes. Vous devez donc être prudent lorsque vous l'essayez.
theterminalguy
1
Veuillez voir mon commentaire sur la réponse acceptée concernant l'utilisation kill -9par cœur / habituellement.
lindes
29

Vous devez obtenir l'ID de processus du programme en utilisant le port TCP 3000. Pour obtenir l'ID de processus

lsof -i tcp:3000 -t

Et puis en utilisant cet identifiant de processus, il suffit de tuer le processus en utilisant la commande ubuntu kill.

kill -9 pid

Ou exécutez simplement la commande de combinaison mentionnée ci-dessous. Il va d'abord récupérer pid puis tuer ce processus.

kill -9 $(lsof -i tcp:3000 -t)
Shahzad Tariq
la source
Veuillez voir mon commentaire sur la réponse acceptée concernant l'utilisation kill -9par cœur / habituellement.
lindes
17

Pour toute personne tombant sur cette question qui n'est pas sur un Mac: en supposant que vous savez que votre serveur fonctionne sur le port 3000, vous pouvez le faire en une seule fois en exécutant ce qui suit:

fuser -k 3000/tcp

Mais comme Toby l'a mentionné, l'implémentation de l'unité de fusion dans Mac OS est plutôt primitive et cette commande ne fonctionnera pas sur mac.

saneshark
la source
1
Cela ne fonctionnera pas sur le mac (Mac a été stipulé dans la question) car le fuser n'accepte que c, f et u en option.
Toby
J'ai mis à jour la réponse et elle explique comment l'utiliser également pour les utilisateurs de Mac. Il n'y a aucune raison de rejeter le vote, surtout si l'on considère les autres, y compris moi-même suis tombé sur cette question dans le passé bien que je ne sois pas sur un Mac.
saneshark
L'ajout d'un -vindicateur affiche également une petite quantité d'informations sur le processus tué. Alors fuser -kv 3000/tcp. Hélas, le fuser de MacOS n'a pas cette capacité. kill $(lsof -ti tcp:3000)est un équivalent assez proche, cependant.
lindes
14

Parfois, il est possible que le serveur de rails ne se ferme pas correctement. Vous pouvez trouver le processus utilisé par les rails

ps aux | rails grep

La sortie sera comme

user     12609  9.8  0.5  66456 45480 pts/0    Sl+  21:06   0:02 /home/user/.rvm/rubies/ruby-2.2.0-preview1/bin/ruby bin/rails s

Ici, process_id 12609 est utilisé par votre serveur de rails.

Vous pouvez le tuer facilement par commande

tuer -9 12609

devudilip
la source
C'est devenu "ps aux | grep ruby" pour moi. Peut-être du passage de webrick à puma
rigyt
Veuillez voir mon commentaire sur la réponse acceptée concernant l'utilisation kill -9par cœur / habituellement.
lindes
Je devais le faire pour trouver le bon processusps aux | grep puma
Sami Birnbaum
11

Toutes les réponses ci-dessus sont vraiment bonnes mais j'avais besoin d'un moyen de taper le moins possible dans le terminal alors j'ai créé un petit bijou pour ça. Vous ne pouvez installer la gemme qu'une seule fois et exécuter la commande «shutup» à chaque fois que vous voulez tuer le processus Rails (tout en étant dans le dossier actuel).

gem install shutup

puis allez dans le dossier courant de votre projet de rails et lancez

shutup # cela va tuer le processus Rails en cours d'exécution

Vous pouvez utiliser la commande «shutup» à chaque fois que vous le souhaitez

DICLAIMER: Je suis le créateur de ce joyau

REMARQUE: si vous utilisez rvm, installez la gemme à l'échelle mondiale

rvm @global do gem install shutup
Lorenzo Sinisi
la source
c'est bien. En regardant la source, votre bijou recherche le fichier pid, mais il n'est pas garanti qu'il existe. l' lsofapproche est plus fiable.
max pleaner
@maxpleaner: vrai, et aussi plus susceptible de tuer un autre processus qui pourrait être à l'écoute sur ce port, au cas où cela aurait été fait (peut-être par accident).
lindes
Cela fonctionne ici. Si vous lisez ceci en 2019, veuillez installer ce bijou, cela fonctionne vraiment, tellement plus facile .. lancez simplement gem install shutup dans votre dossier, et chaque fois que vous devez tuer, tapez simplement "shutup"
Guilherme Nunes
J'ai installé ce joyau et l'ai exécuté et il a tué Sinatra. Cependant, à partir de maintenant, le port par défaut 4567 ne répond pas, ni aucun autre port défini par la commande 'set: port XXXX'. Comment puis-je gérer cela?
NevD
2

ps aux | grep rails utilisent cette commande, vous pouvez tuer le serveur

Bascule
la source
1

Par défaut, le serveur rails utilise le port 3000.
Ainsi, vous avez 2 options pour exécuter le serveur rails.
1. Soit vous pouvez exécuter le serveur sur un autre port en définissant un port personnalisé à l'aide de la commande suivante
rails s -p 3001
2. Ou vous pouvez tuer tout le processus ruby ​​en cours en exécutant la commande suivante,
killall -9 ruby
puis exécutezrails server

Sarwan Kumar
la source
0

Solution en une ligne:

kill -9 $(ps aux | grep 'rails s' | awk {'print$2'}); rails s
Anmol Chawla
la source
-4

Tapez:

man lsof

Recherchez ensuite -w, -n et -i

-i: trucs sur Internet -n: accélère -w: bascule les avertissements

Il y a BEAUCOUP plus de détails sur les pages de manuel

InsanelyADHD
la source
-6

Si vous êtes sur une machine Windows, suivez ces étapes.

c:/project/
cd tmp
c:/project/tmp
cd pids
c:/project/tmp/pids
dir

Vous y trouverez un fichier appelé server.pid

supprime-le.

c:/project/tmp/pid> del *.pid

C'est tout.

EDIT: Veuillez vous référer à ceci

Prabhakar Undurthi
la source
3
Cela n'arrêtera pas le serveur.
Nafaa Boutefer
Bien que ce code puisse aider à résoudre le problème, il fournit un contexte supplémentaire concernant pourquoi et / ou comment il répond à la question (en particulier, pourquoi vous pensez qu'une suggestion pour une machine Windows pourrait être utile pour une question qui indique qu'elle est sur MacOS) améliorerait considérablement sa valeur à long terme. Veuillez modifier votre réponse pour ajouter des explications.
Toby Speight