У меня есть приложение, поддерживающее реакцию, и я хочу написать сценарий для запуска тестовой версии. Мне нужно сбить порт: 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 со временем оказывается не слишком надежным.