Я часто делаю, например,
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? Или есть ли такая небольшая утилита?
Команда может быть сформулирована следующим образом:
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