class Unicorn::Util

Public Class Methods

chown_logs(uid, gid) click to toggle source
# File lib/unicorn/util.rb, line 28
def chown_logs(uid, gid)
  ObjectSpace.each_object(File) do |fp|
    fp.chown(uid, gid) if is_log?(fp)
  end
end
is_log?(fp) click to toggle source
# File lib/unicorn/util.rb, line 19
def 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
end
reopen_logs() click to toggle source

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

# File lib/unicorn/util.rb, line 42
def reopen_logs
  nr = 0

  ObjectSpace.each_object(File) do |fp|
    is_log?(fp) or next
    orig_st = fp.stat
    begin
      b = File.stat(fp.path)
      next if orig_st.ino == b.ino && orig_st.dev == b.dev
    rescue Errno::ENOENT
    end

    open_arg = 'a'
    if fp.respond_to?(:external_encoding) && enc = fp.external_encoding
      open_arg << ":#{enc.to_s}"
      enc = fp.internal_encoding and open_arg << ":#{enc.to_s}"
    end
    fp.reopen(fp.path, open_arg)
    fp.sync = true
    new_st = fp.stat
    if orig_st.uid != new_st.uid || orig_st.gid != new_st.gid
      fp.chown(orig_st.uid, orig_st.gid)
    end
    nr += 1
  end # each_object
  nr
end
tmpio() click to toggle source

creates and returns a new File object. The File is unlinked immediately, switched to binary mode, and userspace output buffering is disabled

# File lib/unicorn/util.rb, line 73
def tmpio
  fp = begin
    TmpIO.open("#{Dir::tmpdir}/#{rand}",
               File::RDWR|File::CREAT|File::EXCL, 0600)
  rescue Errno::EEXIST
    retry
  end
  File.unlink(fp.path)
  fp.binmode
  fp.sync = true
  fp
end