Команда Oneliner, чтобы использовать kill заданный номер порта TCP вместо PID?

8

Я часто делаю например

sudo netstat -lpn |grep :8088

просмотреть вывод

tcp6       0      0 :::8088                 :::*                    LISTEN      11189/java

а потом

sudo kill -kill 11189

Я хотел бы иметь более удобную команду, точно такую ​​же, killatport 8088которая использует номер порта tcp в качестве переменной и которую я могу сделать в качестве псевдонима для конвейера, который делает то, что я хочу, но как мне получить PID из выходных данных и канала это к команде kill? Я полагаю, что я мог бы использовать awk для получения PID из вывода netstat, но как мне защитить и установить точное совпадение портов, чтобы вход 80 не совпадал с 8080 и аналогичным образом? Должен ли я сделать это программой на С вместо? Или уже есть такая маленькая утилита?

Никлас
источник
1
Использование SIGKILL, как правило, плохая идея . Есть причина, почему вы не хотите, чтобы процесс очищался после себя?
гейра
Остановка сервера mvn jetty:stopможет произойти сбой, если экземпляр имеет OutOfMemoryError. Когда я перезапускаю сервлеты Java, случается, что порт недоступен даже при обычной остановке, такой как mvn jetty:stop. Иногда процесс может получить OutOfMemoryErrorи не освободить порт TCP при обычном завершении работы, например mvn jetty:stop.
Никлас
1
Тем mvn jetty:stopне менее, это не то же самое, что отправка SIGTERM, и jvm должен по-прежнему иметь возможность обрабатывать SIGTERM, даже если его приложение (я) находится вне памяти.
гейра

Ответы:

10

fuser может сделать это:

sudo fuser -KILL -k -n tcp 8088
Флориан Диш
источник
2

Команду можно сформулировать так:

netstat -lpn | grep ":1234\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}

Объяснение:

  1. netstat -ltpn

    • Здесь перечислены прослушивающие порты ( l) в TCP ( t) и их программы ( p) без преобразования номеров портов в имена ( n).
  2. grep ":1234\b"

    • Этот поиск :1234сопровождается границей ( \b), указывающей конец слова (или число, в нашем случае). Это гарантирует, что мы не поймать, :12345например.
  3. awk '{sub(/\/.*/, "", $NF); print $NF}'

    • Эта

      • заменители sub(/regex/,"replacewith", #fieldnumber)
      • это регулярное выражение \/.*
      • ни с чем ""
      • в поле $NF, что означает последнее поле (то есть поле, которое содержит PID/program)
      • затем печатает это print $NF.

      Регулярное выражение \/.*совпадает с литералом /и всем после него, а затем мы заменяем его ничем, по существу удаляя его, поэтому в этом поле остается только номер PID.

  4. xargs -i kill -kill {}

    • xargs -iэто программа, которая позволяет сделать вывод предыдущей команды действовать как ввод другой команды. Наша команда kill -kill {}где {}указывает «вывод предыдущей команды в конвейере», который является нашим номером PID.

Примечание: вся эта команда может быть немного опасной, потому что вы можете случайно убить то, что не хотите. Это можно использовать с немного большей дезинфекцией. Просто убедитесь, что вы получаете правильный номер порта при его использовании.

Если вы хотите превратить это в функцию, вы можете добавить следующее ~/.bashrc:

killatport(){
    netstat -lpn | grep ":$1\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}
}

Сохраните и примените изменения, используя source ~/.bashrc. Теперь вы можете использовать функцию следующим образом:

killatport 8088
Алаа али
источник