Serwer Rails mówi, że port jest już używany, jak zabić ten proces?

275

Jestem na komputerze Mac, robiąc:

rails server

Dostaję:

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

Wiem, że mogę uruchomić jeden na nowym porcie, ale chcę zabić ten proces.

Blankman
źródło

Odpowiedzi:

694

Zakładając, że chcesz zabić wszystko, co znajduje się na porcie 3000 (co zwykle używa Webrick), wpisz to w swoim terminalu, aby znaleźć PID procesu:

$ lsof -wni tcp:3000

Następnie użyj liczby w kolumnie PID, aby zabić proces:

$ kill -9 PID
bezczynne palce
źródło
4
czy możesz wyjaśnić -wni
user993563,
53
Dla wyjaśnienia dla nowicjuszy: w drugim wierszu kodu należy zamienić PIDna rzeczywisty numer wyświetlany w konsoli po wprowadzeniu pierwszego wiersza kodu (np 12345.).
CodeBiker,
5
Możesz również znaleźć PID, przechodząc przez katalog railsów do następującego pliku tmp / pids / server.pid
tandy
Może się to zdarzyć, jeśli uruchamiasz debuger w RubyMine i ulega awarii lub coś w tym rodzaju ... Serwer zatrzymuje się, ale debuger kontynuuje ... W każdym razie to jest rozwiązanie, którego użyłem i działa idealnie :)
J Smith
@ tandy jest to dobry sposób na uzyskanie PID dla konkretnego projektu, jednak czasami, gdy proces nagle się zamyka, plik może być nieobecny, ale serwer może nadal działać. Robi lsof -wni tcp:3000się zawsze pokazać wszystkie procesy słuchania tego protokołu: połączenie portu. (gdzie 3000 ma zostać zastąpione lokalnym portem serwera, np. w Railsach jest to domyślnie 3000).
SidOfc,
125

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

Bijan
źródło
3
wszystko między nawiasami zwróci identyfikator procesu, który używa portu 3000. I -toznacza, 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).że chyba wiesz, co killzrobisz
Papouche Guinslyzinho
To powinna być zaakceptowana odpowiedź, ponieważ jest to wiersz „wszystko w jednym”. Umieść to w aliasie i gotowe.
Nubtacular
Gdyby uwzględniono wyjaśnienie, zdecydowanie byłoby to warte pochwały.
mwfearnley,
2
Spowoduje to zabicie wszystkich procesów, w tym wszystkich otwartych sesji przeglądarki. Więc chcesz być ostrożny, gdy go wypróbujesz.
theterminalguy
1
Proszę zobaczyć mój komentarz do zaakceptowanej odpowiedzi na temat korzystania kill -9przez pamięć / nałogowo.
Lindes
29

Musisz uzyskać identyfikator procesu programu za pomocą portu TCP 3000. Aby uzyskać identyfikator procesu

lsof -i tcp:3000 -t

A następnie używając tego identyfikatora procesu, po prostu zabij proces za pomocą komendy ubuntu kill.

kill -9 pid

Lub po prostu uruchom poniższe polecenie łączenia. Najpierw pobierze pid, a następnie zabije ten proces.

kill -9 $(lsof -i tcp:3000 -t)
Shahzad Tariq
źródło
Proszę zobaczyć mój komentarz do zaakceptowanej odpowiedzi na temat korzystania kill -9przez pamięć / nałogowo.
Lindes
17

Dla każdego, kto natknie się na to pytanie, którego nie ma na komputerze Mac: zakładając, że wiesz, że twój serwer działa na porcie 3000, możesz to zrobić jednym strzałem, wykonując następujące czynności:

fuser -k 3000/tcp

Ale jak wspomniał Toby, implementacja utrwalacza w Mac OS jest dość prymitywna i to polecenie nie będzie działać na Macu.

Saneshark
źródło
1
To nie zadziała na Macu (Mac został określony w pytaniu), ponieważ utrwalacz akceptuje tylko c, f i u jako opcje.
Toby
Zaktualizowałem odpowiedź, która dotyczy również sposobu jej używania przez użytkowników komputerów Mac. Nie ma powodu, aby głosować odmiennie, zwłaszcza biorąc pod uwagę inne osoby, w tym mnie, które natknęły się na to pytanie w przeszłości, mimo że nie byłem na komputerze Mac.
saneshark
Dodanie -vflagi pokazuje również niewielką ilość informacji o tym, jaki proces został zabity. Tak fuser -kv 3000/tcp. Niestety utrwalacz systemu MacOS nie ma tej zdolności. kill $(lsof -ti tcp:3000)jest jednak dość bliskim odpowiednikiem.
Lindes
14

Czasami istnieje szansa, że ​​serwer szyn nie zostanie poprawnie zamknięty. Możesz znaleźć proces używany przez szyny

ps aux | szyny grep

Wyjście będzie jak

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

Tutaj proces_id 12609 jest używany przez twój serwer szynowy.

Możesz go łatwo zabić poleceniem

zabij -9 12609

devudilip
źródło
To stało się dla mnie „ps aux | grep ruby”. Może z przejścia z webrick na puma
rigyt
Proszę zobaczyć mój komentarz do zaakceptowanej odpowiedzi na temat korzystania kill -9przez pamięć / nałogowo.
Lindes
Musiałem to zrobić, aby znaleźć właściwy procesps aux | grep puma
Sami Birnbaum,
11

Wszystkie powyższe odpowiedzi są naprawdę dobre, ale potrzebowałem sposobu, aby wpisać jak najmniej w terminalu, więc stworzyłem do tego klejnot. Możesz zainstalować klejnot tylko raz i uruchomić polecenie „zamknij” za każdym razem, gdy chcesz zabić proces Railsów (będąc w bieżącym folderze).

gem install shutup

następnie przejdź do bieżącego folderu projektu Rails i uruchom

shutup # to zabije aktualnie uruchomiony proces Railsowy

Możesz użyć polecenia „zamknij się” za każdym razem, kiedy chcesz

DICLAIMER: Jestem twórcą tego klejnotu

UWAGA: jeśli używasz rvm, zainstaluj klejnot na całym świecie

rvm @global do gem install shutup
Lorenzo Sinisi
źródło
to jest miłe. Patrząc na źródło, twój klejnot szuka pliku pid, ale nie ma gwarancji, że istnieje. lsofpodejście jest bardziej niezawodny.
max pleaner
@maxpleaner: prawda, a także bardziej prawdopodobne, że zabije jakiś inny proces, który może nasłuchiwać na tym porcie, na wypadek, gdyby zostało to zrobione (być może przez przypadek).
Lindes
To działa tutaj. Jeśli czytasz to w 2019 r., Zainstaluj ten klejnot, to naprawdę działa, o wiele łatwiej .. po prostu uruchom zamykanie instalacji klejnotów w swoim folderze i za każdym razem, gdy musisz zabić, po prostu wpisz „zamknij”
Guilherme Nunes
Zainstalowałem ten klejnot, uruchomiłem go i zabił Sinatrę. Jednak od tej pory domyślny port 4567 nie odpowiada ani żaden inny port ustawiony za pomocą polecenia „set: port XXXX”. Jak sobie z tym poradzić?
NevD
2

szyny ps aux | grep używają tego polecenia, aby zabić serwer

Biegun
źródło
1

Domyślnie serwer Railsowy używa portu 3000.
Masz więc 2 opcje uruchomienia serwera Railsowego.
1. Albo możesz uruchomić serwer na innym porcie, definiując port niestandardowy za pomocą następującego polecenia
rails s -p 3001
2. Lub możesz zabić cały działający proces ruby, uruchamiając następujące polecenie,
killall -9 ruby
a następnie uruchomrails server

Sarwan Kumar
źródło
0

Rozwiązanie jednoliniowe:

kill -9 $(ps aux | grep 'rails s' | awk {'print$2'}); rails s
Anmol Chawla
źródło
-4

Wpisz:

man lsof

Następnie poszukaj -w, -n i -i

-i: rzeczy internetowe -n: przyspiesza -w: przełącza ostrzeżenia

Istnieje więcej szczegółów na stronach podręcznika

InsanelyADHD
źródło
-6

Jeśli korzystasz z komputera z systemem Windows, wykonaj następujące kroki.

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

Tam znajdziesz plik o nazwie server.pid

Usuń to.

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

Otóż ​​to.

EDYCJA: Proszę odnieść się do tego

Prabhakar Undurthi
źródło
3
To nie zatrzyma serwera.
Nafaa Boutefer
Chociaż ten kod może pomóc w rozwiązaniu problemu, zapewnia dodatkowy kontekst dotyczący tego, dlaczego i / lub jak odpowiada na pytanie (w szczególności, dlaczego uważasz, że sugestia dla komputera z systemem Windows może być przydatna w przypadku pytania, które mówi, że jest na MacOS) znacznie poprawiłoby jego długoterminową wartość. Proszę edytować swoje odpowiedzi, aby dodać trochę wyjaśnień.
Toby Speight