如何将stdout追加到pyinotify守护进程的文件中?
问题描述:
我想添加手表使用python pyinotify和daemonize通知程序。如何将stdout追加到pyinotify守护进程的文件中?
notifier = pyinotify.Notifier(wm, handler)
notifier.loop(daemonize=True, pid_file='/tmp/pyinotifier.pid',
stdout='/tmp/out.log', stderr='/tmp/error.log')
但是我可以发现,日志文件被覆盖不会被追加。 有没有办法追加stdout
和stderr
? 我在Linux操作系统上。
感谢
答
看着the source,看起来好像在日志中O_WRONLY
模式,这就是为什么你看到他们正在每次覆盖调用循环开:
def __daemonize(self, pid_file=None, stdin=os.devnull, stdout=os.devnull,
stderr=os.devnull):
"""
@param pid_file: file where the pid will be written. If pid_file=None
the pid is written to
/var/run/<sys.argv[0]|pyinotify>.pid, if pid_file=False
no pid_file is written.
@param stdin:
@param stdout:
@param stderr: files associated to common streams.
"""
if pid_file is None:
dirname = '/var/run/'
basename = os.path.basename(sys.argv[0]) or 'pyinotify'
pid_file = os.path.join(dirname, basename + '.pid')
if pid_file != False and os.path.lexists(pid_file):
err = 'Cannot daemonize: pid file %s already exists.' % pid_file
raise NotifierError(err)
def fork_daemon():
# Adapted from Chad J. Schroeder's recipe
# @see http://code.activestate.com/recipes/278731/
pid = os.fork()
if (pid == 0):
# parent 2
os.setsid()
pid = os.fork()
if (pid == 0):
# child
os.chdir('/')
os.umask(022)
else:
# parent 2
os._exit(0)
else:
# parent 1
os._exit(0)
fd_inp = os.open(stdin, os.O_RDONLY)
os.dup2(fd_inp, 0)
fd_out = os.open(stdout, os.O_WRONLY|os.O_CREAT, 0600)
os.dup2(fd_out, 1)
fd_err = os.open(stderr, os.O_WRONLY|os.O_CREAT, 0600)
os.dup2(fd_err, 2)
# Detach task
fork_daemon()
# Write pid
if pid_file != False:
flags = os.O_WRONLY|os.O_CREAT|os.O_NOFOLLOW|os.O_EXCL
fd_pid = os.open(pid_file, flags, 0600)
os.write(fd_pid, str(os.getpid()) + '\n')
os.close(fd_pid)
# Register unlink function
atexit.register(lambda : os.unlink(pid_file))
有一个pull request打开打开日志O_APPEND
模式,但它已近8个月,作者没有回应。
看起来现在看起来没有合理的方式来追加日志。
好的..谢谢..我将在调用循环之前用时间戳重命名日志文件。 – SKRP