我正在使用python-daemon包在 python 中编写一个守护进程。守护程序在引导时启动 (init.d),需要访问各种设备。守护进程将在运行 ubuntu的嵌入式系统 ( beaglebone ) 上运行。
现在我的问题是我想以非特权用户而不是(例如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和完整组成员身份的守护进程?