Der Rails-Server sagt, dass der Port bereits verwendet wurde. Wie kann dieser Prozess abgebrochen werden?

275

Ich bin auf einem Mac und mache:

rails server

Ich bekomme:

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

Ich weiß, dass ich einen an einem neuen Port starten kann, aber ich möchte diesen Prozess beenden.

Blankman
quelle

Antworten:

694

Angenommen, Sie möchten alles töten, was sich auf Port 3000 befindet (was normalerweise von Webrick verwendet wird), geben Sie dies in Ihr Terminal ein, um die PID des Prozesses herauszufinden:

$ lsof -wni tcp:3000

Verwenden Sie dann die Nummer in der PID-Spalte, um den Prozess abzubrechen:

$ kill -9 PID
Leerlauffinger
quelle
4
Könnten
user993563
53
Nur zur Veranschaulichung für Anfänger: In der zweiten Codezeile sollen Sie die PIDdurch die tatsächliche Nummer ersetzen, die bei der Eingabe der ersten Codezeile in Ihrer Konsole angezeigt wird (z 12345. B. ).
CodeBiker
5
Sie können die PID auch finden, indem Sie durch Ihr Rails-Verzeichnis zur folgenden Datei tmp / pids / server.pid
tandy
Dies kann passieren, wenn Sie den Debugger in RubyMine ausführen und er abstürzt oder so ... Der Server stoppt, aber der Debugger wird fortgesetzt ... Wie auch immer, dies ist die Lösung, die ich verwendet habe und die perfekt funktioniert :)
J Smith
@tandy Dies ist eine gute Möglichkeit, die PID für ein bestimmtes Projekt abzurufen. Manchmal fehlt die Datei jedoch, wenn ein Prozess plötzlich geschlossen wird, aber der Server wird möglicherweise noch ausgeführt. Ein Tun lsof -wni tcp:3000wird immer zeigen alle Prozesse auf diesem Protokoll hören: Port - Kombination. (wobei 3000 durch Ihren lokalen Server-Port ersetzt werden soll, z. B. in Rails ist dies standardmäßig 3000).
SidOfc
125

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

Bijan
quelle
3
Alles zwischen den Klammern gibt eine Prozess-ID zurück, die den Port 3000 verwendet. Und -tbedeutet, 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).dass Sie kill
wahrscheinlich
Dies sollte die akzeptierte Antwort sein, da es sich um eine "All-in-One" -Zeile handelt. Geben Sie dies in einen Alias ​​ein und Sie können loslegen.
Nubtacular
Wenn eine Erklärung enthalten wäre, wäre dies definitiv eine Gegenstimme wert.
mwfearnley
2
Dadurch werden alle Prozesse einschließlich aller geöffneten Browsersitzungen abgebrochen. Sie möchten also vorsichtig sein, wenn Sie es ausprobieren.
Theterminalguy
1
Bitte beachten Sie meinen Kommentar zur akzeptierten Antwort zur Verwendung kill -9durch Auswendiglernen.
Lindes
29

Sie müssen die Prozess-ID des Programms über den TCP-Port 3000 abrufen. Um die Prozess-ID abzurufen

lsof -i tcp:3000 -t

Und dann mit dieser Prozess-ID einfach den Prozess mit dem Befehl ubuntu kill beenden.

kill -9 pid

Oder führen Sie einfach den unten genannten Kombinationsbefehl aus. Es wird zuerst pid holen und dann diesen Prozess beenden.

kill -9 $(lsof -i tcp:3000 -t)
Shahzad Tariq
quelle
Bitte beachten Sie meinen Kommentar zur akzeptierten Antwort zur Verwendung kill -9durch Auswendiglernen.
Lindes
17

Wenn Sie auf diese Frage stoßen, die sich nicht auf einem Mac befindet: Wenn Sie wissen, dass Ihr Server auf Port 3000 ausgeführt wird, können Sie dies auf einmal tun, indem Sie Folgendes ausführen:

fuser -k 3000/tcp

Aber wie Toby erwähnt hat, ist die Implementierung von Fixiereinheit unter Mac OS ziemlich primitiv und dieser Befehl funktioniert auf Mac nicht.

Saneshark
quelle
1
Dies funktioniert auf dem Mac nicht (Mac wurde in der Frage festgelegt), da die Fixiereinheit nur c, f und u als Optionen akzeptiert.
Toby
Ich habe die Antwort aktualisiert und sie beschreibt, wie sie auch für Mac-Benutzer verwendet werden kann. Es gibt keinen Grund, die Abstimmung zu verringern, insbesondere wenn man bedenkt, dass andere, einschließlich mir, in der Vergangenheit über diese Frage gestolpert sind, obwohl ich nicht auf einem Mac bin.
Saneshark
Das Hinzufügen einer -vFlagge zeigt auch eine kleine Menge an Informationen darüber, welcher Prozess beendet wurde. Also fuser -kv 3000/tcp. Leider hat die Fixiereinheit von MacOS diese Fähigkeit nicht. kill $(lsof -ti tcp:3000)ist jedoch ein ziemlich nahes Äquivalent.
Lindes
14

Manchmal besteht die Möglichkeit, dass der Rails-Server nicht ordnungsgemäß geschlossen wird. Sie können den von Schienen verwendeten Prozess finden

ps aux | Grep Rails

Die Ausgabe wird wie sein

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

Hier wird process_id 12609 von Ihrem Rails-Server verwendet.

Sie können es leicht auf Befehl töten

töte -9 12609

Devudilip
quelle
Dies ist für mich zu "ps aux | grep ruby" geworden. Vielleicht vom Wechsel von Webrick zu Puma
Rigyt
Bitte lesen Sie meinen Kommentar zur akzeptierten Antwort zur Verwendung kill -9durch Auswendiglernen.
Lindes
Ich musste dies tun, um den richtigen Prozess zu findenps aux | grep puma
Sami Birnbaum
11

Alle obigen Antworten sind wirklich gut, aber ich brauchte eine Möglichkeit, so wenig wie möglich in das Terminal zu tippen, also habe ich ein Juwel dafür geschaffen. Sie können den Edelstein nur einmal installieren und den Befehl 'shutup' jedes Mal ausführen, wenn Sie den Rails-Prozess beenden möchten (während Sie sich im aktuellen Ordner befinden).

gem install shutup

Gehen Sie dann in den aktuellen Ordner Ihres Rails-Projekts und führen Sie es aus

shutup # Dadurch wird der derzeit ausgeführte Rails-Prozess beendet

Sie können den Befehl 'shutup' jederzeit verwenden

DICLAIMER: Ich bin der Schöpfer dieses Edelsteins

HINWEIS: Wenn Sie rvm verwenden, installieren Sie den Edelstein global

rvm @global do gem install shutup
Lorenzo Sinisi
quelle
das ist ordentlich. Wenn Sie sich die Quelle ansehen, sucht Ihr Juwel nach der PID-Datei, aber das ist nicht garantiert. Der lsofAnsatz ist zuverlässiger.
Max Pleaner
@maxpleaner: true, und es ist auch wahrscheinlicher, dass ein anderer Prozess abgebrochen wird, der möglicherweise diesen Port abhört, falls dies geschehen ist (möglicherweise aus Versehen).
Lindes
Es funktioniert hier. Wenn Sie dies im Jahr 2019 lesen, installieren Sie bitte dieses Juwel, es funktioniert wirklich, viel einfacher. Führen Sie einfach Gem Install Shutup in Ihrem Ordner aus, und jedes Mal, wenn Sie töten müssen, geben Sie einfach "Shutup" ein
Guilherme Nunes
Ich habe dieses Juwel installiert und es ausgeführt und es hat Sinatra getötet. Ab sofort reagiert jedoch weder der Standardport 4567 noch ein anderer Port, der mit dem Befehl 'set: port XXXX' festgelegt wurde. Wie kann ich damit umgehen?
NevD
2

ps aux | grep Rails Mit diesem Befehl können Sie den Server beenden

Rocker
quelle
1

Standardmäßig verwendet der Rails-Server Port 3000.
Sie haben also zwei Möglichkeiten, den Rails-Server auszuführen.
1. Entweder können Sie den Server auf einem anderen Port ausführen, indem Sie mit dem folgenden Befehl einen benutzerdefinierten Port definieren.
rails s -p 3001
2. Oder Sie können den gesamten laufenden Ruby-Prozess beenden, indem Sie den folgenden Befehl
killall -9 ruby
ausführen und dann ausführenrails server

Sarwan Kumar
quelle
0

Einzeilige Lösung:

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

Eintippen:

man lsof

Suchen Sie dann nach -w, -n und -i

-i: Internet-Zeug -n: macht es schneller -w: schaltet Warnungen um

Es gibt viel mehr Details auf den Manpages

Wahnsinnig ADHS
quelle
-6

Wenn Sie sich auf einem Windows-Computer befinden, führen Sie die folgenden Schritte aus.

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

Dort finden Sie eine Datei namens server.pid

Lösche es.

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

Das ist es.

EDIT: Bitte beziehen Sie sich darauf

Prabhakar Undurthi
quelle
3
Dadurch wird der Server nicht gestoppt.
Nafaa Boutefer
Obwohl dieser Code Hilfe sein kann , das Problem, die Bereitstellung zusätzlichen Kontextes in Bezug auf lösen , warum und / oder wie es beantwortet die Frage (insbesondere , warum Sie denken , ein Vorschlag für eine Windows - Maschine für eine Frage nützlich sein könnte , die besagen , dass es auf MacOS ist) würde seinen langfristigen Wert erheblich verbessern. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen.
Toby Speight