Убить любой сервис, работающий на определенном порту

13

Я пытаюсь написать скрипт, который убивает службу, работающую на определенном порту. Это мой сценарий:

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

Это Java-программа. Этот сценарий иногда работает, но таинственным образом терпит неудачу большую часть времени.

Есть ли другой способ убить службу, работающую на порту? Мой порт есть 4990.

Абхишек дот пи
источник
Ваш сценарий также убил бы процессы Java, работающие на других домашних животных, таких как 14990.
roaima

Ответы:

32

Вы можете попробовать fuser:

fuser -k 4990/tcp

Или используйте lsofдля получения идентификатора процесса, затем введите kill:

kill $(sudo lsof -t -i:4990)
cuonglm
источник
Должен ли я заменить TCP на Java?
Абхишек дот пи
@Abhishekdotpy: нет, используйте tcp.
cuonglm
Спасибо за этот -tфлаг, я так нуждался в нем так долго.
Джексон
Не могли бы вы дать подсказку, как правильно передать последнюю строку в ssh?
Владимир Проценко
@VladimirProtsenko Можете ли вы предоставить больше контекста?
Cuonglm
4

Если вы хотите уничтожить какую-либо службу или процесс, работающий на порту 8080, сначала вам нужно найти идентификационный номер процесса порта 8080 (PID), а затем уничтожить его. Выполните следующую команду, чтобы найти 8080 номер порта PID:

sudo lsof -t -i:8080

Вот,

  • sudo - команда для запроса прав администратора (идентификатор пользователя и пароль).
  • lsof - список файлов (также используется для отображения связанных процессов)
  • -t - показать только идентификатор процесса
  • -i - показывать только процесс подключения к интернету
  • : 8080 - показывать только процессы с этим номером порта

Теперь вы можете легко убить свой PID с помощью следующей команды:

sudo kill -9 <PID>

Вот,

  • kill - команда, чтобы убить процесс
  • -9 - насильно

Вы можете использовать одну команду, чтобы убить процесс на определенном порту, используя следующую команду:

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

Для получения дополнительной информации вы можете увидеть следующую ссылку Как убить процесс на конкретном порту в Linux

Махфуз
источник
Использование не kill -9дает целевому процессу никакой возможности убирать. Попробуйте использовать обычный kill, по крайней мере, на начальном этапе.
Роайма
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. создать файл php kill.php
  2. запустите php файл с нужным портом $ php kill.php 8088
Нивы
источник
1
Использование не kill -9дает целевому процессу никакой возможности убирать. Попробуйте использовать обычный kill, по крайней мере, на начальном этапе.
Рояма
+1 за использование PHP для этой задачи.
Bananguin
@ G-Man по ошибке добавил
нивас
@Bananguin, чтобы убить точный идентификатор процесса данного порта, использую это при выполнении процесса связки с jenkins
nivas
при запуске файлов сценария и его содержат lsof -t -i:port_idкоманды при процессе сборки port_idили process idиз port_idможет быть пустым, то время мы получаем некоторую команду ошибку, чтобы избежать такого рода ошибки утра использовал это. здесь я могу убить точный идентификатор процесса данного порта
nivas