Beenden Sie alle Dienste, die an einem bestimmten Port ausgeführt werden

13

Ich versuche, ein Skript zu schreiben, das den Dienst beendet, der an einem bestimmten Port ausgeführt wird. Das ist mein Skript:

a=$(ps ax | grep 4990 | grep java | awk '{print $1}')
kill -9 $a

Es ist ein Java-Programm. Dieses Skript funktioniert manchmal, schlägt aber die meiste Zeit auf mysteriöse Weise fehl.

Gibt es eine andere Möglichkeit, einen auf einem Port ausgeführten Dienst zu beenden? Mein Hafen ist 4990.

Abhishek dot py
quelle
Ihr Skript würde auch Java-Prozesse beenden, die auf anderen Haustieren wie 14990 ausgeführt werden.
Roaima

Antworten:

32

Sie können versuchen fuser:

fuser -k 4990/tcp

Oder verwenden Sie lsof, um die Prozess-ID abzurufen, und geben Sie dann Folgendes ein kill:

kill $(sudo lsof -t -i:4990)
cuonglm
quelle
Sollte ich TCP durch Java ersetzen müssen?
Abhishek dot py
@Abhishekdotpy: Nein, benutze tcp.
Cuonglm
Danke für diese -tFlagge, das habe ich so lange gebraucht.
Jackson
Könnten Sie einen Hinweis geben, wie Sie die letzte Zeile ordnungsgemäß an ssh übergeben können?
Vladimir Protsenko
@VladimirProtsenko können Sie mehr Kontext bereitstellen?
Cuonglm
4

Wenn Sie einen Dienst oder Prozess beenden möchten, der auf Port 8080 ausgeführt wird, müssen Sie zuerst die PID (8080 Port Process Identification Number) ermitteln und dann beenden. Führen Sie den folgenden Befehl aus, um die PID der 8080-Portnummer zu ermitteln:

sudo lsof -t -i:8080

Hier,

  • sudo - Befehl zum Abfragen von Administratorrechten (Benutzer-ID und Passwort).
  • lsof - Liste der Dateien (Wird auch zum Auflisten verwandter Prozesse verwendet)
  • -t - Nur Prozess-ID anzeigen
  • -i - zeigt nur den Prozess der Internetverbindung an
  • : 8080 - Nur Prozesse in dieser Portnummer anzeigen

So können Sie Ihre PID jetzt ganz einfach mit dem folgenden Befehl beenden:

sudo kill -9 <PID>

Hier,

  • kill - Befehl zum Beenden des Prozesses
  • -9 - kraftvoll

Mit einem Befehl können Sie einen Prozess an einem bestimmten Port mit dem folgenden Befehl beenden:

sudo kill -9 $(sudo lsof -t -i:8000)

Weitere Informationen finden Sie unter folgendem Link: So beenden Sie einen Prozess an einem bestimmten Port unter Linux

Mahfuz
quelle
Die Verwendung kill -9gibt dem Zielprozess keine Gelegenheit zum Aufräumen. Erwägen Sie killzumindest anfänglich die Verwendung von Plain .
Roaima
1
<?php
  $port = $argv[1]; 
  if(!empty($port) && is_numeric($port) ){
  $pid = trim(shell_exec("lsof -t -i:".$port));
  if(!empty($pid)){
     shell_exec("sudo kill -9 ".$pid);
     echo "pid : ".$pid."  killed which is listened port : ".$port."\xA";
  }
  else{
     echo " [X] no such process found for pid : ".$port."\xA";
  }
  }
  else{ 
     echo " invalid pid \xA";
  }
?>
  1. Erstellen Sie eine PHP-Datei kill.php
  2. Führen Sie die PHP-Datei mit dem erforderlichen Port aus $ php kill.php 8088
nivas
quelle
1
Die Verwendung kill -9gibt dem Zielprozess keine Gelegenheit zum Aufräumen. Erwägen Sie killzumindest anfänglich die Verwendung von Plain .
Roaima
+1 für die Verwendung von PHP für diese Aufgabe.
Bananguin
@ G-Man versehentlich hinzugefügt
Nivas
@ Bananguin, um die genaue Prozess-ID des angegebenen Ports zu beenden, verwende dies, wenn ein
Bündelprozess
Wenn Sie Skriptdateien ausführen und den lsof -t -i:port_idBefehl enthalten, wenn der Erstellungsprozess leer ist, kann das port_idoder process idvon port_idleer sein. Diesmal wird ein Befehlsfehler angezeigt, um diese Art von Fehler zu vermeiden. Hier kann ich die genaue Prozess-ID des angegebenen Ports töten
nivas