1

ユニコーン プロセスからファイルを取得しようchownとすると、奇妙な問題が発生します。chgrpから同じコードを実行するとrails c、グループが正しいグループに変更されます。例:

bash-$ whoami
zac

bash-$ groups
zachallett sysadmin

bash-$ ls -la
...
-rwxrw---- zac sysadmin 154 Nov 1 15:33 file.txt
...

レールコントローラーのアクション:

def controller
  file = "#{Rails.root}/file.txt"
  %x(chgrp zachallett #{file})
end

ユニコーンログ:

chgrp: changing group of `/var/www/app/current/file.txt': Operation not permitted

の出力ps aux | grep unicorn:

zac    6579  0.0  1.1 254640 45188 ?        Sl   17:13   0:01 unicorn_rails master -c config/unicorn.rb -E production -D                                               
zac    6582  0.0  1.0 254640 42704 ?        Sl   17:13   0:00 unicorn_rails worker[0] -c config/unicorn.rb -E production -D                                            
zac    6585  0.0  1.0 254640 42704 ?        Sl   17:13   0:00 unicorn_rails worker[1] -c config/unicorn.rb -E production -D                                            
zac    6588  0.0  1.0 254640 42704 ?        Sl   17:13   0:00 unicorn_rails worker[2] -c config/unicorn.rb -E production -D                                            
zac    6591  0.0  1.0 254640 42704 ?        Sl   17:13   0:00 unicorn_rails worker[3] -c config/unicorn.rb -E production -D                                            
zac    6594  0.0  1.1 254728 45004 ?        Sl   17:13   0:00 unicorn_rails worker[4] -c config/unicorn.rb -E production -D                                            
zac    6597  0.0  1.1 254728 45072 ?        Sl   17:13   0:00 unicorn_rails worker[5] -c config/unicorn.rb -E production -D                                            
zac    7274  0.0  0.0 103232   848 pts/0    S+   17:32   0:00 grep unicorn

から同じchgrpを実行するとrails c、グループがうまく変更されます。したがって、ユーザーzacはファイルを所有しており、sysadminグループの一部chgrpですが、ユニコーンプロセスからファイルを実行できません。

編集: unicorn.rb 設定ファイルを追加

env = ENV["RAILS_ENV"] || "development"

working_directory "/var/www/<APP>/current"
pid               "/var/www/<APP>/shared/pids/unicorn.pid"
stderr_path       "/var/www/<APP>/shared/log/unicorn/stderr.log"
stdout_path       "/var/www/<APP>/shared/log/unicorn/stdout.log"

listen            "/var/www/<APP>/shared/sockets/unicorn.socket"
worker_processes  env == "production" ? 6 : 2
timeout           120
preload_app       true
user              "zac", "sysadmin"

before_fork do |server, worker|
  old_pid = "/var/www/<APP>/shared/pids/unicorn.pid.oldbin"

  if File.exists?(old_pid) && server.pid != old_pid
    begin
      Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
      # already killed
    end
  end
end
4

0 に答える 0