1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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
|