Кнопка остановки RubyMine создает зомби-серверы Puma в приложении Rails

Смежные вопросы / проблемы, не связанные непосредственно с этой проблемой

Характеристики

  • 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 Майкла Хартла).

0 ответов

Другие вопросы по тегам