Send this to a friend
1 require 'fileutils'
2
3 module Daemon
4 WorkingDirectory = File.expand_path(File.dirname(__FILE__))
5
6 class Base
7 def self.pid_fn
8 File.join(WorkingDirectory, "#{name}.pid")
9 end
10
11 def self.daemonize
12 Controller.daemonize(self)
13 end
14 end
15
16 module PidFile
17 def self.store(daemon, pid)
18 File.open(daemon.pid_fn, 'w') {|f| f << pid}
19 end
20
21 def self.recall(daemon)
22 IO.read(daemon.pid_fn).to_i rescue nil
23 end
24 end
25
26 module Controller
27 def self.daemonize(daemon)
28 case !ARGV.empty? && ARGV[0]
29 when 'start'
30 start(daemon)
31 when 'stop'
32 stop(daemon)
33 when 'restart'
34 stop(daemon)
35 start(daemon)
36 else
37 puts "Invalid command. Please specify start, stop or restart."
38 exit
39 end
40 end
41
42 def self.start(daemon)
43 fork do
44 Process.setsid
45 exit if fork
46 PidFile.store(daemon, Process.pid)
47 Dir.chdir WorkingDirectory
48 File.umask 0000
49 STDIN.reopen "/dev/null"
50 STDOUT.reopen "/dev/null", "a"
51 STDERR.reopen STDOUT
52 trap("TERM") {daemon.stop; exit}
53 daemon.start
54 end
55 end
56
57 def self.stop(daemon)
58 if !File.file?(daemon.pid_fn)
59 puts "Pid file not found. Is the daemon started?"
60 exit
61 end
62 pid = PidFile.recall(daemon)
63 FileUtils.rm(daemon.pid_fn)
64 pid && Process.kill("TERM", pid)
65 end
66 end
67 end
require 'fileutils'
module Daemon
WorkingDirectory = File.expand_path(File.dirname(__FILE__))
class Base
def self.pid_fn
File.join(WorkingDirectory, "#{name}.pid")
end
def self.daemonize
Controller.daemonize(self)
end
end
module PidFile
def self.store(daemon, pid)
File.open(daemon.pid_fn, 'w') {|f| f << pid}
end
def self.recall(daemon)
IO.read(daemon.pid_fn).to_i rescue nil
end
end
module Controller
def self.daemonize(daemon)
case !ARGV.empty? && ARGV[0]
when 'start'
start(daemon)
when 'stop'
stop(daemon)
when 'restart'
stop(daemon)
start(daemon)
else
puts "Invalid command. Please specify start, stop or restart."
exit
end
end
def self.start(daemon)
fork do
Process.setsid
exit if fork
PidFile.store(daemon, Process.pid)
Dir.chdir WorkingDirectory
File.umask 0000
STDIN.reopen "/dev/null"
STDOUT.reopen "/dev/null", "a"
STDERR.reopen STDOUT
trap("TERM") {daemon.stop; exit}
daemon.start
end
end
def self.stop(daemon)
if !File.file?(daemon.pid_fn)
puts "Pid file not found. Is the daemon started?"
exit
end
pid = PidFile.recall(daemon)
FileUtils.rm(daemon.pid_fn)
pid && Process.kill("TERM", pid)
end
end
end