2016-07-21 21 views
0

我想添加手錶使用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') 

但是我可以發現,日誌文件被覆蓋不會被追加。 有沒有辦法追加stdoutstderr? 我在Linux操作系統上。

感謝

回答

0

看着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個月,作者沒有迴應。

看起來現在看起來沒有合理的方式來追加日誌。

+0

好的..謝謝..我將在調用循環之前用時間戳重命名日誌文件。 – SKRP