Назад | Перейти на главную страницу

Upstart: Почему два процесса работают от имени другого пользователя?

Я хочу, чтобы приложение nodejs работало, поэтому я выполнил следующее: http://howtonode.org/deploying-node-upstart-monit и установил Monit и Upstart, которые уже пару месяцев отлично работают. Я только что добавил в свое приложение функцию, которая разрешает запись на диск, и получаю ошибки с разрешениями. Я искал все, потому что казалось, что ошибки разрешений не должны быть проблемой. Оказывается, пользователь, которого я начинаю с Upstart, на самом деле не является пользователем, запускающим приложение!

Когда я бегу:

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

Либо через Monit / Upstart, либо просто через SSH, он создает 2 процесса. Из 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

Когда я вхожу в систему как deploy user и просто запустите:

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

Есть только 1 процесс!

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

Эта проблема заключается в том, что по какой-то причине второй процесс не имеет правильных разрешений на запись и, похоже, выполняет всю работу. Все идеально, когда я не использую Upstart, включая записи, но мне нужен Upstart / Monit, чтобы мое приложение nodejs работало.

Тогда как лучше всего настроить Monit / Upstart в этом случае? Я хочу сохранить низкие разрешения (отсюда и deploy пользователь, у которого нет sudo), и я хочу, чтобы приложение запускалось при сбое.

Это мой сценарий 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

Что-то не так?

В учебнике говорится использовать sudo -u user ... чтобы запустить его от имени пользователя, которого вы хотите. Но вот в чем проблема.

Спасибо!

Павел

sudo сохраняется, пока выполняется процесс, поэтому решение заключается в использовании разделов setuid и setgid выскочки. Проблема в том, что для строки, отправляющей PID демона, требуются привилегии root. Вот обходной путь:

[имя] .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

[имя] -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