Я пишу демон на python, используя пакет python-daemon. демон запускается во время загрузки (init.d) и нуждается в доступе к различным устройствам. демон должен работать во встроенной системе (beaglebone), работающей под управлением Ubuntu.
теперь моя проблема в том, что я хочу запустить демон как непривилегированный пользователь (например, mydaemon
), а не root
.
чтобы разрешить демону доступ к устройствам, я добавил этого пользователя в необходимые группы. в коде Python я использую daemon.DaemonContext(uid=uidofmydamon)
.
процесс, запущенный root
, прекрасно демонизируется и принадлежит правильному пользователю, но я получаю ошибки отказ в доступе при попытке доступа к устройствам. Я написал небольшое тестовое приложение, и кажется, что процесс не наследует членство в группах пользователя.
#!/usr/bin/python
import logging, daemon, os
if __name__ == '__main__':
lh=logging.StreamHandler()
logger = logging.getLogger()
logger.setLevel(logging.INFO)
logger.addHandler(lh)
uid=1001 ## UID of the daemon user
with daemon.DaemonContext(uid=uid,
files_preserve=[lh.stream],
stderr=lh.stream):
logger.warn("UID : %s" % str(os.getuid()))
logger.warn("groups: %s" % str(os.getgroups()))
когда я запускаю приведенный выше код как пользователь с uid=1001, я получаю что-то вроде
$ ./testdaemon.py
UID: 1001
groups: [29,107,1001]
тогда как когда я запускаю приведенный выше код от имени пользователя root (или su
), я получаю:
$ sudo ./testdaemon.py
UID: 1001
groups: [0]
Как я могу создать демон-процесс, запущенный пользователем root, но с другим эффективным uid и неповрежденным членством в группах?