Ошибка цикла прослушивания Puma: # в конфигурации puma.rb

#ruby-on-rails #ruby #puma

#ruby-on-rails #ruby #puma

Вопрос:

Когда я запускаю puma, я получаю эту ошибку:

 2019-04-22 19:59:10 -0500: Listen loop error: #<Errno::EBADF: Bad file descriptor>
/Users/my_account/.rvm/gems/ruby-2.5.5/gems/puma-3.12.1/lib/puma/server.rb:386:in `select'
/Users/my_account/.rvm/gems/ruby-2.5.5/gems/puma-3.12.1/lib/puma/server.rb:386:in `handle_servers'
/Users/my_account/.rvm/gems/ruby-2.5.5/gems/puma-3.12.1/lib/puma/server.rb:360:in `block in run'
2019-04-22 19:59:10 -0500: Listen loop error: #<Errno::EBADF: Bad file descriptor>
/Users/my_account/.rvm/gems/ruby-2.5.5/gems/puma-3.12.1/lib/puma/server.rb:386:in `select'
/Users/my_account/.rvm/gems/ruby-2.5.5/gems/puma-3.12.1/lib/puma/server.rb:386:in `handle_servers'
/Users/my_account/.rvm/gems/ruby-2.5.5/gems/puma-3.12.1/lib/puma/server.rb:360:in `block in run'
2019-04-22 19:59:10 -0500: Listen loop error: #<Errno::EBADF: Bad file descriptor>
/Users/my_account/.rvm/gems/ruby-2.5.5/gems/puma-3.12.1/lib/puma/server.rb:386:in `select'
/Users/my_account/.rvm/gems/ruby-2.5.5/gems/puma-3.12.1/lib/puma/server.rb:386:in `handle_servers'
/Users/my_account/.rvm/gems/ruby-2.5.5/gems/puma-3.12.1/lib/puma/server.rb:360:in `block in run'
2019-04-22 19:59:10 -0500: Listen loop error: #<Errno::EBADF: Bad file descriptor>
  

Мой файл puma.rb:

 workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['MAX_THREADS'] || 5)
threads threads_count, threads_count

rackup      DefaultRackup
port        ENV['PORT']     || 3000
environment ENV['RAILS_ENV'] || 'development'

on_restart do
  puts "Puma restarting..."
end

app_dir = File.expand_path("../..", __FILE__)
log_dir = "#{app_dir}/log"

puts "LOG DIR: #{log_dir}"

if ENV['RAILS_ENV'] == 'production'
  stdout_redirect "#{log_dir}/puma.stdout.log", "#{log_dir}/puma.stderr.log", true
end

Causes problem
on_worker_boot do
  ActiveRecord::Base.establish_connection
end

Causes problem
preload_app!
  

Эта проблема вызвана файлом конфигурации puma.rb. Я раскомментировал каждую строку, чтобы посмотреть, будет ли какая-либо из них работать, но, похоже, наличие любой строки кода в файле puma.rb просто вызывает Errno::EBADF: Bad file descriptor ошибку.

Комментарии:

1. Два быстрых предположения: 1) другой экземпляр сервера работает в фоновом режиме; 2) вы используете номер порта, для которого требуется доступ уровня администратора ( sudo ). Например, попытка запустить Puma на порту 80 приведет к ошибкам, если у вас нет прав администратора.

2. Я не был уверен, но думал, что это мой конфигурационный файл puma.rb. Прокомментировал это и работает с настройками по умолчанию. Я думаю, что некоторые настройки изменились.

3. Рассмотрите возможность редактирования вопроса — добавьте puma.rb файл конфигурации, чтобы мы могли помочь отследить причину.

Ответ №1:

Если вы используете capistrano, вам нужно прокомментировать preload_app! попробуйте использовать поэтапный перезапуск вместо перезапуска

Я решил эту проблему с помощью следующих изменений в puma.rb (конфигурационном файле). В моем случае я использую capistrano для развертывания и перезапуска puma. Для использования команды поэтапного перезапуска требуется 2: workers >= 2 и не использовать предварительную загрузку

 workers 2
#preload_app! 
  

Моя команда перезапуска (поэтапный перезапуск):

pumactl -S /srv/apps/my_app/shared/tmp/pids/puma.state -F /srv/apps/my_app/shared/config/puma.rb phased-restart

Комментарии:

1. Мне пришлось обновить свой puma gem с 4.x на 5.x , а затем удалить preload_app! из config/puma.rb .

2. К вашему сведению, preload_app автоматически используется в puma 5 , когда workers равно >= 2.