У меня есть приложение, поддерживающее реакцию, и я хочу написать сценарий для запуска тестовой версии. Мне нужно сбить порт: 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
.
Я думаю, что весь ваш подход ошибочен, вам, вероятно, следует запустить свою службу под 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
lsof -i :8081 | awk '{system("kill -9 " $2)}'
должны делать то, что вы хотите. Однако будьте осторожны в системе с очень высокой нагрузкой, в которой много недолговечных процессов. Может случиться так, что вы убьете не тот процесс, потому что иногда результат lsof со временем оказывается не слишком надежным.
Просматривал этот пост. Здесь предлагается несколько способов убить процесс, вытащенный с помощью lsof.
Самый простой способ убить -
kill $(lsof -ti:PORT)
Это автоматически уничтожит все идентификаторы процессов, полученные в цикле.