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

фьюзер может сделать это:

 sudo fuser -KILL -k -n tcp 8088 

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

 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 например, :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