Я думаю, что это известная ошибка в пакете сетевого менеджера и была исправлена в версии 0.9.2. Патч еще нет (декабрь 2011 г.), интегрированный в репозитории mainline.
lsof -i tcp:8080 производит вывод, затем | egrep -v "COMMAND PID USER" отбрасывает строку заголовка, затем | awk '{print $2}' печатает второе поле, | sort -n подготавливает номера для | uniq, который только выводит каждый уникальный PID один раз. Объединяя все это, получаем:
lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq
Но pkill -KILL tomcat или killall -KILL tomcat проще.
Не забывайте, что опция --no-run-if-empty для kill:)
lsof -ti :8080 | xargs --no-run-if-empty kill -9
Таким образом, kill будет запущен, будет прослушивание процесса, не нужно делать проверьте себя.
Один лайнер из @waltinator велик.
Я добавлю еще немного вкуса к нему:
lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq | xargs kill -9
OR
kill -9 $(lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq)
ПРИМЕЧАНИЕ. Это все еще очень просто, вам может потребоваться добавить больше соли и перца, чтобы сделать его более надежным в реальной среде. Это сценарий, в котором я немного проверил проверку ошибок.
#!/bin/bash
PORT=$1
if ! [[ "$PORT" =~ ^[0-9]+$ ]] ;
then
printf "error: '$PORT' is not a number.\n\nUsage killport <port number>\n"
exit 1
fi
PID=$(lsof -ti:$PORT)
if ! [[ "$PID" =~ ^[0-9]+$ ]] ;
then
printf "no proccess found, nothing to kill.\n"
exit 0
fi
printf "killing process $PID running on $PORT\n"
kill -9 $PID
Вот простая функция рыбной оболочки
function kill-port
set pids (lsof -ti tcp:$argv)
if test $pids
kill -9 $pids
else
echo "No proccesses on that port to kill to see for your self -- lsof -i tcp:$argv"
end
end
просто вставьте эту присоску в файл в этом месте ~/.config/fish/functions/kill-port.fish и ваше добро. Вы можете называть его как kill-port 8000