Zabij dowolną usługę działającą na określonym porcie

13

Próbuję napisać skrypt, który zabija usługę działającą na określonym porcie. To jest mój skrypt:

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

To jest program Java. Ten skrypt czasami działa, ale przez większość czasu w tajemniczy sposób zawodzi.

Czy istnieje inny sposób zabicia usługi działającej na porcie? Mój port to 4990.

Abhishek dot py
źródło
Twój skrypt zabiłby również procesy Java uruchomione na innych zwierzakach, takich jak 14990.
roaima

Odpowiedzi:

32

Możesz spróbować fuser:

fuser -k 4990/tcp

Lub za pomocą, lsofaby uzyskać identyfikator procesu, a następnie przesłać do kill:

kill $(sudo lsof -t -i:4990)
Cuonglm
źródło
Czy powinienem wymienić tcp na Java?
Abhishek dot py py
@Abhishekdotpy: Nie, użyj tcp.
cuonglm
Dziękuję za tę -tflagę, tak długo jej potrzebowałem.
Jackson,
Czy możesz podpowiedzieć, jak poprawnie przekazać ostatnią linię do ssh?
Vladimir Protsenko
@VladimirProtsenko czy możesz podać więcej kontekstu?
cuonglm
4

Jeśli chcesz zabić dowolną usługę lub proces działający na porcie 8080, najpierw musisz znaleźć numer identyfikacyjny procesu 8080 (PID), a następnie go zabić. Uruchom następującą komendę, aby znaleźć numer 8080 portu PID:

sudo lsof -t -i:8080

Tutaj,

  • sudo - polecenie zapytania o uprawnienia administratora (identyfikator użytkownika i hasło).
  • lsof - lista plików (służy również do wyświetlania listy powiązanych procesów)
  • -t - wyświetla tylko identyfikator procesu
  • -i - pokazuje tylko proces związany z połączeniami internetowymi
  • : 8080 - wyświetla tylko procesy w tym numerze portu

Możesz więc teraz łatwo zabić swój PID za pomocą następującego polecenia:

sudo kill -9 <PID>

Tutaj,

  • kill - polecenie zabicia procesu
  • -9 - siłą

Możesz użyć jednego polecenia, aby zabić proces na określonym porcie za pomocą następującego polecenia:

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

Aby uzyskać więcej informacji, zobacz poniższy link Jak zabić proces na określonym porcie w systemie Linux

Mahfuz
źródło
Użycie nie kill -9daje procesowi docelowemu możliwości uporządkowania. Rozważ użycie zwykłego kill, przynajmniej na początku.
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. utwórz plik php kill.php
  2. uruchom plik php z wymaganym portem $ php kill.php 8088
nivas
źródło
1
Użycie nie kill -9daje procesowi docelowemu możliwości uporządkowania. Rozważ użycie zwykłego kill, przynajmniej na początku.
roaima,
+1 za użycie PHP do tego zadania.
Bananguin
@ G-Man przez pomyłkę dodano
nivas
@Banguanguin, aby zabić dokładny identyfikator procesu dla danego portu, używam tego podczas wykonywania procesu
grupowego za pomocą Jenkinsa
podczas uruchamiania skryptów i jego zawierać lsof -t -i:port_idpolecenia, gdy proces Zbuduj port_idlub process idz port_idmoże być pusta, że razem możemy dostać jakiś błąd polecenia, aby uniknąć tego rodzaju błędów jestem przyzwyczajony to. tutaj mogę zabić dokładny identyfikator procesu dla danego portu
nivas