Опция пользователя конфигурации супервизора в разделе программы

У меня есть программа Tornado, и вся относительная библиотека Python установлена ​​пользователем без полномочий root с именем bob:

pip install --user xxx

Теперь я хочу запустить его в супервизоре:

[program:testpro]
command=python /path/to/myfile.py
user=bob    ; set the user to bob
redirect_stderr=true
stdout_logfile=/path/to/log
numproces=1
autostart=true

но это не удалось, в статусе supervisorctl:

testpro            FATAL     Exited too quickly (process log may have details)

Я вижу журнал и нахожу, что он не может импортировать относительную библиотеку Python, поэтому он не запускается как bob.

тогда я перехожу на:

[program:testpro]
command=sudo -u bob -i python /path/to/myfile.py
;user=bob ;comment this
redirect_stderr=true
stdout_logfile=/path/to/log
numproces=1
autostart=true

и все работает нормально

Итак, что значит опция user делать? и как я могу сконфигурировать запускаемого пользователя в опции?

3 ответа

Решение

Я решил эту проблему:

добавлять environment опция в разделе программы:

environment=HOME="/home/bob",USER="bob"

См. Документ Supervisor - среда подпроцесса:

При запуске подпроцесса оболочка не выполняется, поэтому переменные среды, такие как USER, PATH, HOME, SHELL, LOGNAME и т. Д., Не изменяются по умолчанию или не назначаются иным образом. Это особенно важно отметить, когда вы запускаете программу из супервизора, запускаемого от имени пользователя root с конфигурацией user = stanza. В отличие от cron, supervisord не пытается предугадать и переопределить "фундаментальные" переменные среды, такие как USER, PATH, HOME и LOGNAME, когда он выполняет setuid для пользователя, определенного в параметре конфигурации user= program. Если вам нужно установить переменные среды для конкретной программы, которые в противном случае могли бы быть установлены вызовом оболочки для конкретного пользователя, вы должны сделать это явно в параметре конфигурации среды = программы. Пример установки этих переменных среды приведен ниже.

[program:apache2]
command=/home/chrism/bin/httpd -c "ErrorLog
/dev/stdout" -DFOREGROUND user=chrism
environment=HOME="/home/chrism",USER="chrism"

Вы можете использовать опцию каталога.

"Когда supervisord демонизирует, переключитесь на этот каталог. Эта опция может включать значение"

[program:testpro]
command=python /path/to/myfile.py
directory=/path/to/
user=bob    ; set the user to bob
redirect_stderr=true
stdout_logfile=/path/to/log
numproces=1
autostart=true

Не забудьте перезапустить сам супервизор, например, с /etc/init.d/supervisord restart потому что в противном случае ваши изменения не будут приняты, и он продолжит работу вашего сервиса от имени пользователя root.

Другие вопросы по тегам