问题描述
我有一个SystemD服务,该服务在引导时加载(运行python脚本)。有时,尝试访问日志文件的脚本会出现权限错误。
Sep 30 14:47:53 Fresno2-encoder manager.py[1266]: from streamStatus import StreamStatus
Sep 30 14:47:53 Fresno2-encoder manager.py[1266]: File "/var/www/html/EncoderAdmin/streamStatus.py",line 10,in <module>
Sep 30 14:47:53 Fresno2-encoder manager.py[1266]: logHandler = TimedRotatingFileHandler("/var/www/html/EncoderAdmin/stream_status.log",when="midnight",backupCount=10)
Sep 30 14:47:53 Fresno2-encoder manager.py[1266]: File "/usr/lib/python2.7/logging/handlers.py",line 171,in __init__
Sep 30 14:47:53 Fresno2-encoder manager.py[1266]: BaseRotatingHandler.__init__(self,filename,'a',encoding,delay)
Sep 30 14:47:53 Fresno2-encoder manager.py[1266]: File "/usr/lib/python2.7/logging/handlers.py",line 64,in __init__
Sep 30 14:47:53 Fresno2-encoder manager.py[1266]: logging.FileHandler.__init__(self,mode,delay)
Sep 30 14:47:53 Fresno2-encoder manager.py[1266]: File "/usr/lib/python2.7/logging/__init__.py",line 913,in __init__
Sep 30 14:47:53 Fresno2-encoder manager.py[1266]: StreamHandler.__init__(self,self._open())
Sep 30 14:47:53 Fresno2-encoder manager.py[1266]: File "/usr/lib/python2.7/logging/__init__.py",line 943,in _open
Sep 30 14:47:53 Fresno2-encoder manager.py[1266]: stream = open(self.baseFilename,self.mode)
Sep 30 14:47:53 Fresno2-encoder manager.py[1266]: IOError: [Errno 13] Permission denied: '/var/www/html/EncoderAdmin/stream_status.log'
发生这种情况时,我注意到该日志文件是作为root创建的,但是我的脚本是以用户身份运行的。我是否需要在SystemD服务中添加User =选项,以确保每天以正确的用户身份创建日志文件?
编辑:为了阐明更多信息,此日志是为Python类和方法配置的。从其他两个不同的python方法调用此方法。一个以root用户身份运行,另一个以用户身份运行。不确定如何以不同的方式实例化它们。
解决方法
您还可以使用组权限(将用户添加到组中,并确保使用该组作为所有者和组读/写权限来创建日志文件)。