Выскочка: Почему два процесса при выполнении как другой пользователь?

Я хочу поддерживать nodejs приложение в рабочем состоянии, таким образом, я следовал за этим: http://howtonode.org/deploying-node-upstart-monit и установленный Monit и 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 пользователь и просто выполненный:

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/Monit для поддерживания моего nodejs приложения в рабочем состоянии.

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

Это - мой Новомодный сценарий:

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 ... для выполнения его как пользователь, Вы хотите. Но это - вещь, это вызывает проблему.

Спасибо!

Paul

3
задан 2 July 2014 в 22:39
1 ответ

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

.

[name].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

[name]-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
3
ответ дан 3 December 2019 в 06:33

Теги

Похожие вопросы