Команда 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? Или есть ли такая небольшая утилита?

1
задан 22 February 2014 в 00:58

1 ответ

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

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

Объяснение:

netstat -ltpn Здесь перечислены порты прослушивания (l) в TCP (t) и их программы (p) без разрешения номеров портов на имена (n). grep ":1234\b" Это ищет :1234, за которым следует граница (\b), указывая конец слова (или номер в нашем случае). Это гарантирует, что мы не поймаем :12345, например. awk '{sub(/\/.*/, "", $NF); print $NF}' Это заменит sub(/regex/,"replacewith", #fieldnumber) это регулярное выражение \/.* ничем "" в поле $NF, что означает, что последнее поле (т. е. поле, содержащее PID/program) затем печатает его print $NF. Регулярное выражение \/.* соответствует литералу / и всему после него, а затем мы заменяем его ничем, по существу удаляя его, поэтому мы оставляем только номер PID в этом поле. 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 {}
}
[d30 ] Сохраните и примените изменения, используя source ~/.bashrc. Теперь вы можете использовать такую ​​функцию:

killatport 8088
2
ответ дан 24 May 2018 в 11:33

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

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