forked from jicksta/adhearsion
/
custom_daemonizer.rb
45 lines (39 loc) · 1.31 KB
/
custom_daemonizer.rb
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
41
42
43
44
45
# This is largely based on the Daemonize library by Travis Whitton and
# Judson Lester. http://grub.ath.cx/daemonize. I cleaned it up a bit to
# meet Adhearsion's quality standards.
module Adhearsion
module CustomDaemonizer
# Try to fork if at all possible retrying every 5 sec if the
# maximum process limit for the system has been reached
def safefork
begin
pid = fork
return pid if pid
rescue Errno::EWOULDBLOCK
sleep 5
retry
end
end
# This method causes the current running process to become a daemon
def daemonize(log_file='/dev/null')
oldmode = 0
srand # Split rand streams between spawning and daemonized process
safefork and exit # Fork and exit from the parent
# Detach from the controlling terminal
unless sess_id = Process.setsid
raise 'Cannot detach from controlled terminal'
end
# Prevent the possibility of acquiring a controlling terminal
if oldmode.zero?
trap 'SIGHUP', 'IGNORE'
exit if pid = safefork
end
Dir.chdir "/" # Release old working directory
File.umask 0000 # Ensure sensible umask
STDIN.reopen "/dev/null"
STDOUT.reopen '/dev/null', "a"
STDERR.reopen log_file, "a"
return oldmode ? sess_id : 0
end
end
end