#ruby-on-rails #ruby #foreman
#ruby-on-rails #ruby #foreman
Вопрос:
Для запуска приложения я использую Foreman. Foreman запускает процесс из Procfile
web: bundle exec rails server thin -p $PORT
worker: bundle exec rake environment resque:work QUEUE=send_mail
api: bundle exec rails server thin -p $PORT
Если я нажимаю control C в консоли, где я запускаю foreman, foreman завершается, но запущенный процесс не завершается. Возможно ли убить процесс, который форман запускал, когда форман убивал.
Комментарии:
1. У меня точно такая же проблема. Foreman не уничтожит Faye серверы, написанные на Ruby.
2. здесь 1… У меня проблемы с тем, что Foreman также убивает серверы Ruby Faye. Я подозреваю, что это связано с сигналом, который Foreman отправляет процессам, которые он запустил, чтобы убить их, хотя, когда я запускаю сервер Faye вручную, у меня не возникает проблем с его отключением с помощью ctrl c.
3. Убивает ли это их в конечном итоге? Насколько я понимаю Foreman, он выдаст SIGTERM, а затем через 10 секунд — SIGKILL.
Ответ №1:
Приведенный ниже пример предполагает, что используемый порт равен 4567, затем выполните:
lsof -i :4567
Это дает вам pid процесса, скажем 34564, затем уничтожьте его с помощью
kill -9 34564
Если вы используете Windows, установите cygwin для получения lsof
и kill
команд.
Комментарии:
1. И если вы не хотите искать PID, вы можете использовать
killall "foreman: master"
Ответ №2:
Thin не завершается, пока есть открытые соединения. Faye использует длительный опрос или WebSockets (долговременные соединения). Таким образом, конечным результатом является то, что Thin ожидает закрытия ваших соединений Faye.
Попробуйте отключить обработчики сигналов, установленные Thin, и у вас все должно быть в порядке.
Ответ №3:
Я собрал небольшую однострочную версию, которая находит идентификаторы процессов и убивает процессы
kill -9 `lsof -P -i :5000 | sed -n 's/python *([0-9]*).*:5000.*/1/p'`
В данном случае я запускаю процессы python на порту 5000, но вы можете запускать процессы другого типа на других портах, поэтому вам нужно соответствующим образом настроить этот однострочный интерфейс.