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

Задание Upstart от имени непривилегированного пользователя завершается неудачно с отказом в разрешении

Я пытаюсь настроить сервер Sage Cell (математический механизм с открытым исходным кодом), работающий от имени непривилегированного пользователя. Я создал непривилегированного пользователя sagecell делать работу. Он установлен правильно и, если я запускаю его нормально, используя

sagecell@primary-server:~/sage/devel/sagecell$ ../../sage web_server.py

тогда все работает как положено. Интересным требованием к этому приложению (которое может иметь значение, а может и не быть) является то, что для него требуется вход по ssh без пароля (т. Е. ssh localhost работает). Я установил непривилегированную учетную запись с помощью ssh-ключа для выполнения этой работы.

Теперь, вместо того, чтобы вручную создавать сеанс экрана после загрузки сервера и запускать его в сеансе экрана, я попытался выполнить задание выскочки с этой настройкой:

description "Sage Cell Server Starter"

start on runlevel [2345]
stop on starting rc runlevel=[016]

kill timeout 5

exec su -s /bin/sh -c 'exec "$0" "$@"' sagecell -- /home/sagecell/sage/sage /home/sagecell/sage/devel/sagecell/web_server.py

Однако это не работает. Просмотр /var/log/upstart/sagecell.log дает следующую ошибку:

2013-02-20 00:11:09,665 sagecell:INFO starting tornado web server
Traceback (most recent call last):
  File "/home/sagecell/sage/devel/sagecell/web_server.py", line 78, in <module>
    application = SageCellServer()
  File "/home/sagecell/sage/devel/sagecell/web_server.py", line 57, in __init__
    kernel_timeout=kernel_timeout)
  File "/home/sagecell/sage-5.7.rc0/devel/sagecell-main/trusted_kernel_manager.py", line 28, in __init__
    self._sender = sender.AsyncSender() # Manages asynchronous communication
  File "/home/sagecell/sage-5.7.rc0/devel/sagecell-main/sender.py", line 22, in __init__
    self.router.bind(self.filename)
  File "socket.pyx", line 489, in zmq.core.socket.Socket.bind (zmq/core/socket.c:4797)
zmq.core.error.ZMQError: Permission denied

РЕДАКТИРОВАТЬ: Следует отметить, что приложение привязывается к порту 8080 (и только 8080, насколько мне известно). Важно то, что он работает без привилегий, когда я запускаю его, но не когда Upstart запускает его от имени того же пользователя.

Может ли кто-нибудь сказать мне, почему приложение, которое отлично работает под пользователем sagecell не запускается под заданием выскочки, выполняющим сценарий AS sagecell?

Условие запуска с указанием только уровня запуска:

start on runlevel [2345]

происходит очень рано в процессе загрузки. В этот момент обычно нет доступного сетевого устройства. Также многие другие сервисы еще не запущены.

Как видно из этой строки журнала:

File "socket.pyx", line 489, in zmq.core.socket.Socket.bind (zmq/core/socket.c:4797) zmq.core.error.ZMQError: Permission denied

он не может подключиться к сокету, что означает, что сетевое устройство еще не подключено.

Что вам нужно сделать, так это настроить условие запуска, чтобы служба запускалась позже, когда будет достаточно инфраструктуры.
Вот что я использовал в ситуации, когда мне нужно было запустить веб-службу с помощью выскочки:

start on (runlevel [2345] and local-filesystems and net-device-up IFACE!=lo)

Это гарантирует, что ваша служба запускается только тогда, когда доступны локальные файловые системы. и при подключении к сети. Здесь также определено, что для сетевого подключения недостаточно локального устройства обратной петли. Эта строфа требует наличия реального сетевого интерфейса, например eth0.

РЕДАКТИРОВАТЬ

Тогда может быть проблема с каталогом по умолчанию. Upstart запускает запущенные программы с каталогом по умолчанию, установленным в /. Приложение началось с su вероятно, не имеет достаточных прав для записи своих файлов (файлов журналов и т. д.)

Попробуйте добавить следующую строфу:

chdir /home/sagecell/sage/devel/sagecell

Это изменяет каталог по умолчанию на место, где пользователь sagecell имеет права записи.

«Стартовый веб-сервер торнадо» указывает, что он запускает свой собственный веб-сервер, на каком порту? Если обычный порт 80, это может сделать только root. смотреть на http://www.itp.uzh.ch/~dpotter/howto/daemonizeпроверьте, есть ли у Pyhon какие-либо рекомендации для этого. Что рекомендует документация Sage? Это ни в коем случае не второстепенный пакет, я полагаю, они предлагают что-то для основного дистрибутива, такого как Ubuntu (если он еще не упакован для использования).

Если вы используете выскочку 1.4 или новее, вы можете использовать раздел setuid вместо su:

setuid sagecell

Что касается среды, в которой выскочка запускает вашу работу, см .:

Обратите особое внимание на то, что даже такие переменные, как $HOME воля не быть установленным по умолчанию при запуске системного задания от имени любого пользователя. В качестве альтернативы вы можете рассмотреть пользовательское задание:

Если вы действительно хотите использовать экран GNU, см .: