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.