Eu perdi um dia de homem recentemente para isso. O contexto estava tentando executar o Unicorn em um usuário chamado apps e o erro Errno :: EPERM continuava nos mordendo. Aqui está o rastreamento de pilha:
E, [2018-04-12T20:45:07.277588 #2048] ERROR -- : Operation not permitted (Errno::EPERM)
/apps/cas-seas3/shared/bundle/ruby/2.2.0/gems/unicorn-5.4.0/lib/unicorn/worker.rb:143:in 'initgroups'
/apps/cas-seas3/shared/bundle/ruby/2.2.0/gems/unicorn-5.4.0/lib/unicorn/worker.rb:143:in 'user'
/apps/cas-seas3/shared/bundle/ruby/2.2.0/gems/unicorn-5.4.0/lib/unicorn/http_server.rb:657:in 'init_worker_process'
/apps/cas-seas3/shared/bundle/ruby/2.2.0/gems/unicorn-5.4.0/lib/unicorn/http_server.rb:682:in 'worker_loop'
/apps/cas-seas3/shared/bundle/ruby/2.2.0/gems/unicorn-5.4.0/lib/unicorn/http_server.rb:549:in 'spawn_missing_workers'
/apps/cas-seas3/shared/bundle/ruby/2.2.0/gems/unicorn-5.4.0/lib/unicorn/http_server.rb:563:in 'maintain_worker_count'
/apps/cas-seas3/shared/bundle/ruby/2.2.0/gems/unicorn-5.4.0/lib/unicorn/http_server.rb:293:in 'join'
/apps/cas-seas3/shared/bundle/ruby/2.2.0/gems/unicorn-5.4.0/bin/unicorn:126:in '<top (required)>'
/apps/cas-seas3/shared/bundle/ruby/2.2.0/bin/unicorn:23:in 'load'
/apps/cas-seas3/shared/bundle/ruby/2.2.0/bin/unicorn:23:in '<top (required)>'
Instrumentar a base de código com uma instrução print ao redor da linha 143 nos forneceu as seguintes informações de depuração:
user = apps
group=apps
uid=1040
gid=110
whoami=apps
Process.egid = 1001
Essa discrepância entre o gid e o Process.egid causou esse bloqueio de código:
if gid && Process.egid != gid
Process.initgroups(user, gid)
Process::GID.change_privilege(gid)
end
e foi isso que causou a falha.
Eu finalmente tracei uma diferença entre o GID / EGID e o problema era que o usuário dos apps pertencia a um grupo primário diferente (admin). Quando mudei o usuário dos aplicativos para o grupo de aplicativos como primário, então funcionou. Isso foi feito editando o arquivo / etc / passwd que definiu as contas de usuário da caixa.
Outra maneira de testar isso é usar o sg para executar manualmente o unicórnio com o grupo correto usando o comando sg assim:
bundle exec sg apps -c unicorn -c /apps/cas-seas3/current/config/unicorn.rb -E deployment -D
Se você achar que funciona, então é um bom sinal para ver suas configurações de usuário / grupo.
Unicorn parece ser muito sensível às configurações de usuário / grupo para verificar / etc / passwd e / etc / group e também usar essa linha ps para verificar a diferença no processo Unicorn de execução para diferenças no UID e GID:
ps -eo uid,gid,egid,args | grep unicorn
Nota: O unicórnio após o gancho acima não funcionou para mim. Nada funcionou, exceto por isso.