Il server Rails dice che la porta è già utilizzata, come uccidere quel processo?


275

Sono su un mac, facendo:

rails server

Ottengo:

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

So di poterne avviare uno su una nuova porta, ma voglio terminare questo processo.

Risposte:


694

Supponendo che tu stia cercando di uccidere qualsiasi cosa sia sulla porta 3000 (che è ciò che normalmente utilizza webrick), digita questo nel tuo terminale per scoprire il PID del processo:

$ lsof -wni tcp:3000

Quindi, utilizzare il numero nella colonna PID per terminare il processo:

$ kill -9 PID

4
potresti per favore spiegare -wni
user993563

53
Giusto per chiarire per i principianti: nella seconda riga di codice, si suppone che sostituisca il PIDcon il numero effettivo che viene mostrato nella console quando si inserisce la prima riga di codice (ad es 12345.).
CodeBiker

5
È inoltre possibile trovare il PID navigando nella directory delle rotaie al seguente file tmp / pids / server.pid
tandy

Questo può accadere se stai eseguendo il debugger in RubyMine e si blocca o qualcosa del genere ... Il server si arresta ma il debugger continua ... Comunque, questa è la soluzione che ho usato e funziona perfettamente :)
J Smith

@tandy questo è un buon modo per ottenere il PID per un progetto specifico, tuttavia, a volte quando un processo si chiude improvvisamente, il file potrebbe essere assente ma il server potrebbe essere ancora in esecuzione. Facendo un lsof -wni tcp:3000sarà sempre mostrare tutti i processi in ascolto su quel protocollo: combinazione di porta. (dove 3000 deve essere sostituito con la porta del server locale. ad es. in Rails questo è 3000 per impostazione predefinita).
SidOfc,

125

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


3
tutto tra parentesi restituirà un ID processo che utilizza la porta 3000. E -tsignifica 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).che immagino che tu sappia cosa killfarà
Papouche Guinslyzinho,

Questa dovrebbe essere la risposta accettata in quanto è una linea "tutto in uno". Metti questo in un alias e sei a posto.
Spettacolare

Se fosse inclusa una spiegazione, questo varrebbe sicuramente un voto.
mwfearnley,

2
Questo ucciderà tutti i processi, inclusa tutta la sessione del browser aperta. Quindi vuoi stare attento quando lo provi.
theterminalguy,

1
Si prega di vedere il mio commento sulla risposta accettata sull'uso kill -9di rote / abitualmente.
lindes

29

È necessario ottenere l'ID di processo del programma utilizzando la porta tcp 3000. Per ottenere l'ID di processo

lsof -i tcp:3000 -t

E poi usando quell'ID processo, semplicemente uccidi il processo usando il comando ubuntu kill.

kill -9 pid

O semplicemente esegui il comando Combina sotto indicato. Prima prenderà pid e poi ucciderà quel processo.

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

Si prega di vedere il mio commento sulla risposta accettata sull'uso kill -9di rote / abitualmente.
lindes

17

Per chiunque si imbatta in questa domanda che non è su un Mac: supponendo che tu sappia che il tuo server è in esecuzione sulla porta 3000, puoi farlo in un colpo solo eseguendo quanto segue:

fuser -k 3000/tcp

Ma come ha detto Toby, l'implementazione del fusore in Mac OS è piuttosto primitiva e questo comando non funzionerà su Mac.


1
Questo non funzionerà sul Mac (Mac era previsto nella domanda) poiché il fusore accetta solo c, f eu come opzioni.
Toby,

Ho aggiornato la risposta e si rivolge a come usarlo anche per gli utenti mac. Non c'è motivo di votare in basso, soprattutto considerando gli altri, incluso me stesso inciampato su questa domanda in passato, nonostante non fossi su un mac.
saneshark,

L'aggiunta di una -vbandiera mostra anche una piccola quantità di informazioni su quale processo è stato ucciso. Così fuser -kv 3000/tcp. Purtroppo il fusore di MacOS non ha questa capacità. kill $(lsof -ti tcp:3000)è un equivalente abbastanza vicino, però.
lindes

14

Alcune volte è possibile che il server rails non sia chiuso correttamente. È possibile trovare il processo utilizzato dalle rotaie

ps aux | rotaie grep

L'output sarà simile

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

Qui process_id 12609 viene utilizzato dal server rails.

Puoi ucciderlo facilmente a comando

uccidere -9 12609


Questo è diventato "ps aux | grep ruby" per me. Forse dal passaggio da Webrick a
Puma

Si prega di vedere il mio commento sulla risposta accettata sull'uso kill -9di rote / abitualmente.
decora il

Ho dovuto fare questo per trovare il processo giustops aux | grep puma
Sami Birnbaum il

11

Tutte le risposte sopra sono davvero buone, ma avevo bisogno di un modo per digitare il meno possibile nel terminale, quindi ho creato una gemma per questo. Puoi installare la gemma una sola volta ed eseguire il comando 'shutup' ogni volta che vuoi terminare il processo Rails (mentre ti trovi nella cartella corrente).

gem install shutup

quindi vai nella cartella corrente del tuo progetto rails ed esegui

shutup # questo interromperà il processo Rails attualmente in esecuzione

Puoi usare il comando 'shutup' ogni volta che vuoi

DICLAIMER: Sono il creatore di questa gemma

NOTA: se si utilizza rvm, installare la gemma a livello globale

rvm @global do gem install shutup

questo è pulito. Guardando la fonte, la tua gemma cerca il file pid, ma non è garantito che esista. l' lsofapproccio è più affidabile.
max pleaner

@maxpleaner: true, e anche più probabile che uccida qualche altro processo che potrebbe essere in ascolto su quella porta, nel caso in cui sia stato fatto (forse per caso).
decora il

Funziona qui Se stai leggendo questo nel 2019, ti preghiamo di installare questo gioiello, funziona davvero, molto più facilmente .. esegui gem install shutup nella tua cartella e ogni volta che devi uccidere basta digitare "shutup"
Guilherme Nunes

Ho installato questa gemma, l'ho fatta funzionare e ha ucciso Sinatra. Tuttavia, da ora la porta predefinita 4567 non risponde, né qualsiasi altra porta impostata dal comando 'set: port XXXX'. Come posso gestirlo?
NevD


1

Per impostazione predefinita, il server rails utilizza la porta 3000.
Pertanto, sono disponibili 2 opzioni per eseguire il server rails.
1. O è possibile eseguire il server su un'altra porta definendo la porta personalizzata utilizzando il seguente comando
rails s -p 3001
2. Oppure è possibile terminare tutto il processo ruby ​​in esecuzione eseguendo il comando seguente,
killall -9 ruby
quindi eseguirerails server


0

Una soluzione di linea:

kill -9 $(ps aux | grep 'rails s' | awk {'print$2'}); rails s

-4

Digitare:

man lsof

Quindi cerca -w, -n e -i

-i: roba internet -n: rende più veloce -w: attiva / disattiva gli avvisi

Ci sono MODI più dettagli nelle pagine man


-6

Se sei su una macchina Windows, segui questi passaggi.

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

Lì troverai un file chiamato server.pid

Cancellalo.

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

Questo è tutto.

EDIT: si prega di fare riferimento a questo


3
Ciò non arresterà il server.
Nafaa Boutefer,

Sebbene questo codice possa essere d'aiuto per risolvere il problema, fornendo un contesto aggiuntivo riguardo al perché e / o al modo in cui risponde alla domanda (in particolare, perché ritieni che un suggerimento per un computer Windows possa essere utile per una domanda che afferma che è su MacOS) migliorerebbe significativamente il suo valore a lungo termine. Si prega di modificare la risposta di aggiungere qualche spiegazione.
Toby Speight,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.