.png)
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_app
diretó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 screen
isso 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.