Как написать shscript для уничтожения -9 pid, который можно найти через lsof -i


29

Я использую 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

Я хочу получить все номера pid и убить их. Дело в том, что я не знаю, как изолировать это поле.


1
Если вы уверены, что у вас tomcatоткрыт только один процесс, вы можете использоватьkillall -9 tomcat
Joseph R.

Ответы:


57

Существует -t(краткий) вариант lsof, который, кажется, делает именно то, что вы ищете, т.е.

$ 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)

Теперь вы ответили на оба вопроса, которые я задавал кстати ;-)
user2757729

3

Не забудьте --no-run-if-emptyвариант убить :)

lsof -ti :8080 | xargs --no-run-if-empty kill -9

Таким образом, kill будет запущен только при прослушивании процесса, не нужно выполнять проверку самостоятельно.


«--no-run-if-empty» не поддерживается в BSD (mac)
dinesh ygv

1

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проще.


Процесс Tomcat не называется "Tomcat", это проблема. Это просто обычный процесс Java, необходимо выполнить дополнительную работу, чтобы определить правильный процесс, если одновременно запущены другие процессы Java.
Терри Ванг

@ TerryWang Да, это проблема, которая у меня тоже была. Ответ Steeldrivers работает отлично.
user2757729

0

Один лайнер от @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)

ПРИМЕЧАНИЕ: это все еще очень просто, вам может понадобиться добавить больше соли и перца, чтобы сделать его более устойчивым в реальной среде.


0

Это сценарий, который я придумал с небольшой проверкой ошибок.

#!/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

0

Вот простая функция раковины рыбы

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.