Опция пользователя конфигурации супервизора в разделе программы
У меня есть программа 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.