Executando script de shell de inicialização para aplicativo Ruby como outro usuário (não root)

Executando script de shell de inicialização para aplicativo Ruby como outro usuário (não root)

Instalei o RVM usando 'user01' no Ubuntu 14.04 e o user01 pode iniciar meu aplicativo Rails conforme esperado. No entanto, desejo iniciar este aplicativo após a inicialização do sistema. Estou tentando usar o seguinte para conseguir isso:

/var/script/start.sh

screen -d -m mongrel_rails start -e production -p 8088

/etc/rc.local(adicionado antes da saída 0)

sh './var/script/start.sh'

Usando as alterações acima, meu aplicativo Rails não inicia. Posso confirmar isso porque não há nenhuma sessão de tela GNU ativa (o comando screen -d -m mongrel_rails... inicia uma sessão de tela e é desconectado. Devo conseguir ver a sessão com o comando "screen -ls", mas eu não faça isso, mesmo depois de mudar para root).

Mudei para root (sudo su) e tentei iniciar manualmente o aplicativo, mas falhou com o seguinte:

/usr/bin/env: ruby: Arquivo ou diretório inexistente

Achei que o RVM/Ruby está quebrado para root. Confirmei isso executando 'ruby -v' que retornou uma mensagem confirmando que o aplicativo não estava instalado. Este não é o caso do usuário01 que vê informações sobre a versão Ruby instalada.

Continuei procurando uma maneira de contornar isso e descobriesta postagemque sugeriu o seguinte comando para alternar para o usuário durante a execução do comando de inicialização.

su user01 -c '/var/script/start.sh'

Isso não ajudou muito e depois de investigar, descobri que o Ruby estava quebrado para o usuário01 quando eu 'su user01' nesta conta a partir do root. 'ruby -v' também não conseguiu retornar as informações esperadas. Depois de testar manualmente, descobri que digitar 'exit' me retornou ao root, e outro 'exit' me retornou ao user01 (a conta que usei para fazer login) e Ruby funciona corretamente para esta conta.

Alguém pode sugerir uma maneira de contornar isso?

Responder1

Você está usandorvm, então a maneira correta de lidar com Ruby não sendo encontrado éuse um wrapper rvm(em sistemas SysVinit e iniciantes).

Primeiro (opcional), crie um alias para seu aplicativo para o gemset que você deseja usar:

rvm alias create my_app ruby-2.1.4@my_gemset

Em seguida, crie o(s) wrapper(s) desejado(s):

rvm wrapper my_app mongrel_rails

O wrapper é criado no $rvm_path/wrappers/my_appdiretório e você o chama a partir do script de inicialização após trocar de usuário.

su user01 -c '/home/user01/.rvm/wrappers/my_app/mongrel_rails -e production -p 8088'

(Observe que eu removi screenisso completamente, pois há poucos bons motivos para executar isso em uma tela.)

Responder2

Se '/var/script/start.sh' funcionar quando você executá-lo logado como user01, então seu script depende de variáveis ​​de ambiente. Para ver essas variáveis, execute 'env'. Talvez algo esteja faltando quando você tenta executá-lo a partir da conta root via 'su user01 -c'.

O que eu sugeriria é tentar usar uma opção especial '-' com su. Na página de manual:

       -, -l, --login
              make  the  shell a login shell, clears all envvars except
              for TERM, initializes HOME, SHELL, USER, LOGNAME and PATH

Então seu comando ficaria assim:

# su - user01 -c '/var/script/start.sh'

Desta forma, o user01 tornará o shell um shell de login, limpará os envvars e inicializará todas as outras coisas, como diz a página de manual.

informação relacionada