Я часто делаю, например,
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 и аналогичным образом? Должен ли я сделать это программой на С вместо? Или уже есть такая маленькая утилита?
fuser может сделать это:
sudo fuser -KILL -k -n tcp 8088
Команда может быть сформулирована следующим образом:
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)
li> \/.*
li> ""
li> $NF
, что означает последнее поле (т. Е. Поле, содержащее PID/program
) li> print $NF
. li> Регулярное выражение \/.*
совпадает с литералом /
и всем после него, а затем мы заменяем его ничем, по существу удаляя его, поэтому мы осталось только номер 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 {}
}
Сохранить и применить изменения, используя source ~/.bashrc
. Теперь вы можете использовать функцию следующим образом:
killatport 8088