diff options
author | Eric Wong <normalperson@yhbt.net> | 2009-03-02 17:43:28 -0800 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2009-03-03 11:13:17 -0800 |
commit | df9f6823188b4189a46b21494d215a07dc6add36 (patch) | |
tree | 25e98ab98752007ac9bfff353818dbba2ca756cf /lib/unicorn | |
parent | 72d09ad565e0844a1429fbe8bc83930ed676f737 (diff) | |
download | unicorn-df9f6823188b4189a46b21494d215a07dc6add36.tar.gz |
Since I use it myself and also in the tests, we might as well implement it correctly as a class method so people can run it in their trap('USR2') hooks.
Diffstat (limited to 'lib/unicorn')
-rw-r--r-- | lib/unicorn/util.rb | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/unicorn/util.rb b/lib/unicorn/util.rb new file mode 100644 index 0000000..0400fd0 --- /dev/null +++ b/lib/unicorn/util.rb @@ -0,0 +1,40 @@ +require 'fcntl' + +module Unicorn + class Util + class << self + + # this reopens logs that have been rotated (using logrotate(8) or + # similar). It is recommended that you install + # 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) + # Returns the number of files reopened + def reopen_logs + nr = 0 + ObjectSpace.each_object(File) do |fp| + next if fp.closed? + next unless (fp.sync && fp.path[0..0] == "/") + + flags = fp.fcntl(Fcntl::F_GETFL) + open_flags = File::WRONLY | File::APPEND + next unless (flags & open_flags) == open_flags + + begin + a, b = fp.stat, File.stat(fp.path) + next if a.ino == b.ino && a.dev == b.dev + rescue Errno::ENOENT + end + fp.reopen(fp.path, "a") + fp.sync = true + nr += 1 + end # each_object + nr + end + + end + + end +end |