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.

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

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)


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)

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.


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


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

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


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


0

Rozwiązanie jednoliniowe:

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

-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


-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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.