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

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

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 и аналогичным образом? Должен ли я сделать это программой на С вместо? Или уже есть такая маленькая утилита?

8
задан 21 February 2014 в 22:58

2 ответа

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

sudo fuser -KILL -k -n tcp 8088
0
ответ дан 21 February 2014 в 22:58

Команда может быть сформулирована следующим образом:

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
0
ответ дан 21 February 2014 в 22:58

Другие вопросы по тегам:

Похожие вопросы: