Я использую tomcat, и иногда, когда я говорю, чтобы он остановился, он не завершает процесс должным образом.
Мой способ это сделать тоже:
lsof -i tcp:8080
, который выводит:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 888 root 35u IPv6 780659 0t0 TCP *:http-alt (LISTEN)
java 888 root 39r IPv6 790103 0t0 TCP localhost:58916->localhost:http-alt (CLOSE_WAIT)
java 888 root 40r IPv6 792585 0t0 TCP localhost:58936->localhost:http-alt (CLOSE_WAIT)
java 888 root 75r IPv6 785553 0t0 TCP localhost:58701->localhost:http-alt (CLOSE_WAIT)
java 888 root 77r IPv6 787642 0t0 TCP localhost:58814->localhost:http-alt (CLOSE_WAIT)
java 888 root 130u IPv6 783894 0t0 TCP localhost:58686->localhost:http-alt (CLOSE_WAIT)
java 888 root 353u IPv6 780929 0t0 TCP localhost:58632->localhost:http-alt (CLOSE_WAIT)
Затем я запускаю
kill -9 pid
Я хочу получить способ все номера пид и убей их. Дело в том, что я не знаю, как изолировать это поле.
lsof -i tcp:8080
производит вывод, затем | egrep -v "COMMAND PID USER"
отбрасывает строку заголовка, затем | awk '{print $2}'
печатает 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
ИЛИ
kill -9 $(lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq)
ПРИМЕЧАНИЕ: это все еще очень просто, вам может понадобиться добавить больше соли и перец, чтобы сделать его более устойчивым в реальной среде.
BLOCKQUOTE>
Это сценарий, который я придумал с небольшой проверкой ошибок.
#!/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
В lsof
есть опция -t
(краткая), которая, кажется, делает именно то, что вы ищете, т.е.
$ sudo lsof -ti tcp:80
1387
4538
4539
См. man lsof
-t specifies that lsof should produce terse output with process
identifiers only and no header - e.g., so that the output may
be piped to kill(1). -t selects the -w option.
. Предполагая, что у вас есть необходимые разрешения, вы можете передать результат в kill
в виде списка PID с подстановкой команд:
kill -9 $(lsof -ti tcp:80)