Кнопка остановки RubyMine создает зомби-серверы Puma в приложении Rails
Смежные вопросы / проблемы, не связанные непосредственно с этой проблемой
- Puma не умрет, убивая сервер rails с помощью ctrl-c
- Не могу убить процесс - остановка сервера rails
- Неостановимый сервер - рельсы
- Как остановить / убить сервер (разработка) в rubymine
- Не могу остановить сервер рельсов
- Сигнал отправляется кнопкой остановки
- Отправьте сигнал SIGINT запущенной программе.
- Отправка SIGTERM на серверный процесс при запуске через
rails s
(в кластерном режиме) не может остановить сервер успешно - Правильно дождаться рабочего дочернего процесса при выключении через SIGTERM
- Сигнальные ловушки выходят со статусом 0 вместо того, чтобы убивать собственный процесс
- Сервер Rails не останавливается на убийстве Windows bash
- Rubymine в Windows с интерпретатором на основе WSL: Puma не может завершить серверный процесс при его завершении
- Дерево процессов WSL переживает задачу
- [WSL] Rubymine не убивает процесс рельсов, нужно делать это вручную.
Характеристики
- Windows 10 (10.0.17134 Build 17134 с обновлением функций 1803) под управлением Ubuntu 18.04.1 LTS через подсистему Windows для Linux
- RubyMine 2018.2.3
- Пума 3.12.0
- Rails 5.1.4
- Ruby 2.5.1p57
вопрос
Запуск среды разработки с зеленой стрелкой запуска в RubyMine запускает сервер Puma, как и ожидалось. Журнал консоли сервера показывает:
]0;Ubuntu^Z
=> Booting Puma
=> Rails 5.1.4 application starting in development
=> Run `rails server -h` for more startup options
[2331] Puma starting in cluster mode...
[2331] * Version 3.9.1 (ruby 2.5.1-p57), codename: Private Caller
[2331] * Min threads: 5, max threads: 5
[2331] * Environment: development
[2331] * Process workers: 2
[2331] * Preloading application
[2331] * Listening on tcp://127.0.0.1:3000
[2331] Use Ctrl-C to stop
[2331] - Worker 0 (pid: 2339) booted, phase: 0
[2331] - Worker 1 (pid: 2343) booted, phase: 0
(Не уверен, что со сломанными символами вокруг Ubuntu наверху, но это другая проблема...)
Я могу контролировать сервер, выдав ps aux | grep puma
Команда в консоли. Вывод следующий:
samort7 2456 16.9 0.3 430504 66420 tty5 Sl 23:58 0:05 puma 3.9.1 (tcp://127.0.0.1:3000) [rails-sample-app]
samort7 2464 1.6 0.3 849172 54052 tty5 Sl 23:58 0:00 puma: cluster worker 0: 2456 [rails-sample-app]
samort7 2468 1.5 0.3 849176 54052 tty5 Sl 23:58 0:00 puma: cluster worker 1: 2456 [rails-sample-app]
samort7 2493 0.0 0.0 14804 1200 tty4 S 23:59 0:00 grep --color=auto puma
Нажатие на красную кнопку "Стоп" в IntelliJ вызывает появление этой строки в журнале консоли сервера:
Process finished with exit code 1
Тем не менее, работает ps aux| grep puma
снова показывает, что сервер puma все еще работает:
samort7 2464 0.2 0.3 849172 54340 ? Sl Oct12 0:00 puma: cluster worker 0: 2456 [rails-sample-app]
samort7 2468 0.2 0.3 849176 54332 ? Sl Oct12 0:00 puma: cluster worker 1: 2456 [rails-sample-app]
samort7 2505 0.0 0.0 14804 1200 tty4 S 00:01 0:00 grep --color=auto puma
Повторное нажатие кнопки "Пуск" и "Остановка" приведет к созданию все большего числа процессов зомби. Эти процессы могут быть убиты путем выдачи pkill -9 -f puma
команда, но это далеко не идеально и побеждает всю цель кнопки остановки.
ожидаемый результат
Запуск сервера напрямую из терминала с rails s -b 127.0.0.1 -p 3000
запускает сервер, как и раньше, а затем нажатие Ctrl + C дает следующий вывод и не создает зомби-процессы:
[2688] - Gracefully shutting down workers...
[2688] === puma shutdown: 2018-10-13 00:12:00 -0400 ===
[2688] - Goodbye!
Exiting
Анализ
Согласно документации RubyMine, нажмите кнопку "Стоп":
вызывает мягкое уничтожение, позволяющее приложению перехватить
SIGINT
событие и выполнить постепенное завершение (в Windows эмулируется событие Ctrl + C).
Несмотря на то, что утверждается в документации, этого, похоже, не происходит. Кажется, что кнопка остановки на самом деле выдает SIGKILL
сигнал, останавливая процесс, не позволяя ему изящно очистить.
Я также заметил, что если я закрою все окна терминала как внутри, так и снаружи RubyMine, а затем открою новое окно терминала, процессы зомби исчезнут.
Вопрос
Как я могу заставить RubyMine выдавать правильные SIGINT
сигнал при нажатии красной кнопки остановки, чтобы можно было корректно завершить работу сервера Puma без создания процессов зомби?
Для справки, я испытываю эту проблему в этом коммите моей кодовой базы (глава из Rails Tutorial Майкла Хартла).