【问题标题】:How to append stdout to file for pyinotify daemonize?如何将标准输出附加到文件以进行 pyinotify 守护进程?
【发布时间】:2016-07-21 02:00:28
【问题描述】:

我正在尝试使用 python pyinotify 添加手表并守护通知程序。

notifier = pyinotify.Notifier(wm, handler)
notifier.loop(daemonize=True, pid_file='/tmp/pyinotifier.pid',
              stdout='/tmp/out.log', stderr='/tmp/error.log')

但是我可以找到,日志文件被覆盖而不被附加。 有没有办法追加stdoutstderr? 我在 Linux 操作系统上。

谢谢

【问题讨论】:

    标签: python pyinotify


    【解决方案1】:

    查看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 requestopen可以O_APPEND模式打开日志,但是已经快8个月了,作者还没有回复。

    目前似乎没有合理的方式来附加日志。

    【讨论】:

    • 好的..谢谢..我会在调用循环之前用时间戳重命名日志文件。
    猜你喜欢
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2012-10-08
    • 2011-07-21
    • 2011-08-15
    • 1970-01-01
    • 2021-03-03
    • 2011-09-30
    相关资源
    最近更新 更多