[Python3中的旋转(重新打开)文件,当接收到信号时

问题描述 投票:2回答:1

我有简单的脚本,该脚本记录到日志文件。这是我脚本的核心:

with open('/var/log/mail/mail.log', 'a', buffering=1) as f:
    for line in sys.stdin:
        f.write(line)

正在写入的文件/var/log/mail/mail.log必须定期旋转logrotate。此刻,当logrotate旋转文件时,我的脚本无法实现,并继续写入旧文件(现已重命名)。

logrotate可以在文件旋转后执行命令。通常,当rsyslog正在记录时,命令为:

postrotate
    invoke-rc.d rsyslog rotate > /dev/null
endscript

但是就我而言,我需要向脚本发送一些信号,并在脚本中处理该信号。

而且,我事先不知道我的脚本运行时的PID

我如何最好地实现这一点?

python-3.x logging signals logrotate
1个回答
1
投票

作为解决方案,您可以查看打开的日志文件的索引节点是否与路径相同。如果没有,请重新打开文件。这仅适用于Unix。

import os, sys, stat

logfile = '/var/log/mail/mail.log'

while True:
    with open(logfile, 'a', buffering=1) as f:
        f_ino = os.stat(logfile)[stat.ST_INO]
        f_dev = os.stat(logfile)[stat.ST_DEV]
        for line in sys.stdin:
            f.write(line)
            try:
                if os.stat(logfile)[stat.ST_INO] != f_ino or 
                   os.stat(logfile)[stat.ST_DEV] != f_dev:
                    break
            except IOError:
                pass

不需要关闭文件,因为它是由with上下文管理器处理的。

© www.soinside.com 2019 - 2024. All rights reserved.