#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.