Как написать 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 и убить их. Дело в том, что я не знаю, как изолировать это поле.

user2757729
источник
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)
steeldriver
источник
Теперь вы ответили на оба вопроса, которые я задавал кстати ;-)
user2757729
3

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

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

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

SMF
источник
«--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проще.

waltinator
источник
Процесс 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

codenamejames
источник