首页 > 解决方案 > Ruby gem 写入文件系统的权限被拒绝 @ rb_sysopen

问题描述

红宝石 2.4.0

导轨 5.2.3

我有一个使用 Axlsx gem 生成 xlsx 报告的 Rails ActiveJob。当它尝试将文件写入文件系统时:

axlsx.serialize("#{Rails.root}/tmp/#{@report_name}.xlsx")

它给出了以下错误:Errno::EACCES (Permission denied @ rb_sysopen - /var/storage/my_app/releases/20200610141310/tmp/report_for_call_25_20200610142531.xlsx)

完整跟踪:

E,[2020-06-10T14:25:31.090477 #23375] 错误 -- : [ActiveJob] [GenerateReportJob] [013852d1-8127-4db4-90ae-895c998f34c7] 执行 GenerateReportJob 时出错(作业 ID:013852d1-8127-4db4-90ae -895c998f34c7) 异步(默认)在 30.2 毫秒内:
Errno::EACCES(权限被拒绝@rb_sysopen - /var/storage/my_app/releases/20200610141310/tmp/report_for_call_25_20200610142531.xlsx):
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/rubyzip-1.3.0/lib/zip/output_stream.rb:36:in `initialize'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/rubyzip-1.3.0/lib/zip/output_stream.rb:36:in `new'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/rubyzip-1.3.0/lib/zip/output_stream.rb:36:in `initialize'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/rubyzip-1.3.0/lib/zip/output_stream.rb:52:in `new'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/rubyzip-1.3.0/lib/zip/output_stream.rb:52:in `open'
/var/storage/my_app/shared/bundle/ruby/2.4.0/bundler/gems/axlsx-2891eb2246d9/lib/axlsx/package.rb:104:in `serialize'
/var/storage/my_app/releases/20200610141310/lib/my_app/generate_xml_report.rb:87:in `create_excel'
/var/storage/my_app/releases/20200610141310/lib/my_app/generate_xml_report.rb:59:in `generate_report'
/var/storage/my_app/releases/20200610141310/app/jobs/generate_report_job.rb:6:in `执行'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activejob-5.2.3/lib/active_job/execution.rb:39:in `block in perform_now'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:109:in `block in run_callbacks'
/var/storage/my_app/releases/20200610141310/app/jobs/generate_report_job.rb:23:in `around_report_job'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:118:in `block in run_callbacks'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/i18n-1.7.0/lib/i18n.rb:297:in `with_locale'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activejob-5.2.3/lib/active_job/translation.rb:9:in `block (2 levels) in '
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:118:in `instance_exec'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:118:in `block in run_callbacks'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activejob-5.2.3/lib/active_job/logging.rb:26:in `block (4 levels) in '
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/notifications.rb:168:in `block in instrument'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/notifications/instrumenter.rb:23:in `instrument'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/notifications.rb:168:in `instrument'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activejob-5.2.3/lib/active_job/logging.rb:25:in `block (3 levels) in '
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activejob-5.2.3/lib/active_job/logging.rb:46:in `block in tag_logger'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/tagged_logging.rb:71:in `block in tagged'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/tagged_logging.rb:28:in `tagged'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/tagged_logging.rb:71:in `tagged'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activejob-5.2.3/lib/active_job/logging.rb:46:in `tag_logger'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activejob-5.2.3/lib/active_job/logging.rb:22:in `block (2 levels) in '
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:118:in `instance_exec'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:118:in `block in run_callbacks'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:136:in `run_callbacks'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activejob-5.2.3/lib/active_job/execution.rb:38:in `perform_now'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activejob-5.2.3/lib/active_job/execution.rb:24:in `block in execute'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:109:in `block in run_callbacks'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activejob-5.2.3/lib/active_job/railtie.rb:28:in `block (4 levels) in '
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/execution_wrapper.rb:87:in `wrap'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/reloader.rb:73:in `block in wrap'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/execution_wrapper.rb:87:in `wrap'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/reloader.rb:72:in `wrap'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activejob-5.2.3/lib/active_job/railtie.rb:27:in `block (3 levels) in '
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:118:in `instance_exec'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:118:in `block in run_callbacks'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:136:in `run_callbacks'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activejob-5.2.3/lib/active_job/execution.rb:22:in `execute'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/activejob-5.2.3/lib/active_job/queue_adapters/async_adapter.rb:70:in `执行'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/concurrent-ruby-1.1.5/lib/concurrent/executor/ruby_thread_pool_executor.rb:348:in `run_task'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/concurrent-ruby-1.1.5/lib/concurrent/executor/ruby_thread_pool_executor.rb:337:in `block (3 levels) in create_worker'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/concurrent-ruby-1.1.5/lib/concurrent/executor/ruby_thread_pool_executor.rb:320:in `loop'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/concurrent-ruby-1.1.5/lib/concurrent/executor/ruby_thread_pool_executor.rb:320:in `block (2 levels) in create_worker'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/concurrent-ruby-1.1.5/lib/concurrent/executor/ruby_thread_pool_executor.rb:319:in `catch'
/var/storage/my_app/shared/bundle/ruby/2.4.0/gems/concurrent-ruby-1.1.5/lib/concurrent/executor/ruby_thread_pool_executor.rb:319:in `block in create_worker'

Rails 应用程序在用户“app”下运行。

tmp 文件夹的权限为:lrwxrwxrwx 1 app app

我也有一个开发服务器,基本上运行精确的设置,这个问题没有发生。

任何人都可以阐明为什么会这样吗?

标签: ruby-on-railsrubyfile-permissionsaxlsx

解决方案


推荐阅读