Upstart: Por que dois processos são executados como um usuário diferente?

3

Eu quero manter um aplicativo nodejs rodando, então eu segui isso: link e instalei o Monit e o Upstart, que tem funcionado perfeitamente por alguns meses. Acabei de adicionar um recurso ao meu aplicativo que permite gravações em disco e estou recebendo erros de permissão. Eu fui procurar por tudo porque parecia que os erros de permissão não deveriam ser o problema. Acontece que o usuário que eu inicio com o Upstart não é realmente o usuário que está executando o aplicativo!

Quando eu corro:

sudo -u deploy NODE_ENV=production node /srv/www/[name of my app]/dist/app.js

Seja via Monit / Upstart, ou apenas via SSH, ele cria 2 processos. De ps ax :

2869 ?        Ss     0:00 sudo -u deploy node /srv/www/[name of my app]/dist/app.js
2878 ?        Sl     0:01 node /srv/www/[name of my app]/dist/app.js

Quando faço login como o usuário deploy e apenas executo:

NODE_ENV=production node /srv/www/[name of my app]/dist/app.js

Existe apenas 1 processo!

3131 pts/1    Sl+    0:04 node /srv/www/[name of my app]/dist/app.js

Esse problema é que, por algum motivo, o segundo processo não tem as permissões corretas para escrever e parece ser o responsável pelo trabalho. Tudo está perfeito quando eu não uso o Upstart, incluindo as gravações, mas eu preciso do Upstart / Monit para manter meu aplicativo nodejs rodando.

Qual é a melhor maneira de configurar o Monit / Upstart neste caso, então? Quero manter permissões baixas (por isso, o usuário deploy que não tem sudo) e quero que o aplicativo seja iniciado quando ele falhar.

Este é o meu script Upstart:

start on startup
stop on shutdown

script
    export HOME="/home/deploy"

    echo $$ > /var/run/[name of my app].pid
    exec sudo -u deploy NODE_ENV=production node /srv/www/[name of my app]/dist/app.js >> /srv/www/log/[name of my app].sys.log 2>&1
end script

Algo errado aí?

O tutorial diz para usar sudo -u user ... para executá-lo como usuário desejado. Mas isso é o que está causando o problema.

Obrigado!

Paul

    
por Paul Wright 26.06.2014 / 21:23

1 resposta

3

sudo persiste enquanto o processo está rodando, então a solução é usar as estrofes setuid e setgid do upstart. O problema é que a linha que envia o PID do daemon precisa de privilégios de root. Esta é uma solução alternativa:

[nome] .conf:

start on runlevel [2345]
stop on runlevel [016]

env HOME=/home/deploy
env NODE_ENV=production

setuid deploy
setgid deploy

exec node /srv/www/[name]/dist/app.js

[nome] -pidfile.conf

start on started [name]
stop on stopped [name]

pre-start script
    initctl status name | cut -d" " -f4 > /var/run/[name].pid
end script

post-stop exec rm -f /var/run/[name].pid
    
por 01.07.2014 / 10:33