Sha256: 0c45d08bef5629d60c9ca637e72d753e316235ce4f50fcab776e43d030c4a15b
Contents?: true
Size: 1.71 KB
Versions: 19
Compression:
Stored size: 1.71 KB
Contents
# -*- encoding: binary -*- module Unicorn::Util # :stopdoc: def self.is_log?(fp) append_flags = File::WRONLY | File::APPEND ! fp.closed? && fp.sync && fp.path[0] == ?/ && (fp.fcntl(Fcntl::F_GETFL) & append_flags) == append_flags rescue IOError, Errno::EBADF false end def self.chown_logs(uid, gid) ObjectSpace.each_object(File) do |fp| fp.chown(uid, gid) if is_log?(fp) end end # :startdoc: # This reopens ALL logfiles in the process that have been rotated # using logrotate(8) (without copytruncate) or similar tools. # A +File+ object is considered for reopening if it is: # 1) opened with the O_APPEND and O_WRONLY flags # 2) opened with an absolute path (starts with "/") # 3) the current open file handle does not match its original open path # 4) unbuffered (as far as userspace buffering goes, not O_SYNC) # Returns the number of files reopened def self.reopen_logs to_reopen = [] nr = 0 ObjectSpace.each_object(File) { |fp| is_log?(fp) and to_reopen << fp } to_reopen.each do |fp| orig_st = begin fp.stat rescue IOError, Errno::EBADF next end begin b = File.stat(fp.path) next if orig_st.ino == b.ino && orig_st.dev == b.dev rescue Errno::ENOENT end begin File.open(fp.path, 'a') { |tmpfp| fp.reopen(tmpfp) } fp.sync = true new_st = fp.stat # this should only happen in the master: if orig_st.uid != new_st.uid || orig_st.gid != new_st.gid fp.chown(orig_st.uid, orig_st.gid) end nr += 1 rescue IOError, Errno::EBADF # not much we can do... end end nr end end
Version data entries
19 entries across 19 versions & 1 rubygems