Получение PID из списка lsof

У меня есть приложение, поддерживающее реакцию, и я хочу написать сценарий для запуска тестовой версии. Мне нужно сбить порт: 8081, если он жив. Команда:

lsof -i :8081
kill -9 <PID>

lsof возвращает этот результат:

    COMMAND     PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
chrome     2423 loow  127u  IPv4 13749099      0t0  TCP localhost.localdomain:36650->localhost.localdomain:tproxy (ESTABLISHED)
qemu-syst 15091 loow   64u  IPv4 13795587      0t0  TCP localhost.localdomain:43518->localhost.localdomain:tproxy (ESTABLISHED)
qemu-syst 15091 loow   66u  IPv4 13795588      0t0  TCP localhost.localdomain:43520->localhost.localdomain:tproxy (ESTABLISHED)
qemu-syst 15091 loow   89u  IPv4 13777485      0t0  TCP localhost.localdomain:40500->localhost.localdomain:tproxy (ESTABLISHED)
node      16210 loow   16u  IPv6 13747716      0t0  TCP *:tproxy (LISTEN)
node      16210 loow   18u  IPv6 13751322      0t0  TCP localhost.localdomain:tproxy->localhost.localdomain:36650 (ESTABLISHED)
node      16210 loow   19u  IPv6 13798473      0t0  TCP localhost.localdomain:tproxy->localhost.localdomain:43518 (ESTABLISHED)
node      16210 loow   21u  IPv6 13798475      0t0  TCP localhost.localdomain:tproxy->localhost.localdomain:43520 (ESTABLISHED)
node      16210 loow   27u  IPv6 13777958      0t0  TCP localhost.localdomain:tproxy->localhost.localdomain:40500 (ESTABLISHED)

Что именно мне нужно, так это pid службы узла в данном случае 16210. Как я могу получить его из lsof?

Я пробовал lsof -ti: 8081 , который возвращал только pid, но возвращал обратно все. Я попытался расширить его с помощью grep: lsof -ti: 8081 | grep node , который ничего не возвращает.

Мне нужен только идентификатор процесса, чтобы поместить его в kill -9 $ PID .

2
задан 28 April 2017 в 11:59
3 ответа

Я думаю, что весь ваш подход ошибочен, вам, вероятно, следует запустить свою службу под systemd (или обернуть ее в сценарий start-stop в стиле systemV, который записывает PID), что упростило бы остановку правильной службы сильно.

В качестве альтернативы стандартным инструментом для поиска определенного процесса является pgrep , а связанный с ним pkill позволяет вам легко их убить:

pkill -9 -u node  react-native-app-name

Сказав это, чтобы ответить на ваш буквальный вопрос: как правило, правильные служебные процессы, которые следует остановить, - это те, которые предоставляют прослушиватель на этом TCP-порту, т.е. ограничивают вывод lsof с помощью -sTCP: LISTEN

lsof -i :8081 -sTCP:LISTEN |awk 'NR > 1 {print $2}'  |xargs kill -15
6
ответ дан 3 December 2019 в 08:52
lsof -i :8081 | awk '{system("kill -9 " $2)}'

должны делать то, что вы хотите. Однако будьте осторожны в системе с очень высокой нагрузкой, в которой много недолговечных процессов. Может случиться так, что вы убьете не тот процесс, потому что иногда результат lsof со временем оказывается не слишком надежным.

2
ответ дан 3 December 2019 в 08:52

Просматривал этот пост. Здесь предлагается несколько способов убить процесс, вытащенный с помощью lsof.

Самый простой способ убить -

kill $(lsof -ti:PORT)

Это автоматически уничтожит все идентификаторы процессов, полученные в цикле.

0
ответ дан 23 June 2021 в 07:51

Теги

Похожие вопросы