diff options
Diffstat (limited to 'lib/oxidized/cli.rb')
-rw-r--r-- | lib/oxidized/cli.rb | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/lib/oxidized/cli.rb b/lib/oxidized/cli.rb index 00ea4b6..0c87d53 100644 --- a/lib/oxidized/cli.rb +++ b/lib/oxidized/cli.rb @@ -4,7 +4,9 @@ module Oxidized require 'slop' def run + check_pid Process.daemon if @opts[:daemonize] + write_pid begin Oxidized.new rescue => error @@ -19,6 +21,7 @@ module Oxidized Log.info "Oxidized starting, running as pid #{$$}" _args, @opts = parse_opts Oxidized.config.debug = true if @opts[:debug] + @pidfile = File.expand_path("pid") end def crash error @@ -40,5 +43,49 @@ module Oxidized end [opts.parse!, opts] end + + def pidfile + @pidfile + end + + def pidfile? + !!pidfile + end + + def write_pid + if pidfile? + begin + File.open(pidfile, ::File::CREAT | ::File::EXCL | ::File::WRONLY){|f| f.write("#{Process.pid}") } + at_exit { File.delete(pidfile) if File.exists?(pidfile) } + rescue Errno::EEXIST + check_pid + retry + end + end + end + + def check_pid + if pidfile? + case pid_status(pidfile) + when :running, :not_owned + puts "A server is already running. Check #{pidfile}" + exit(1) + when :dead + File.delete(pidfile) + end + end + end + + def pid_status(pidfile) + return :exited unless File.exists?(pidfile) + pid = ::File.read(pidfile).to_i + return :dead if pid == 0 + Process.kill(0, pid) + :running + rescue Errno::ESRCH + :dead + rescue Errno::EPERM + :not_owned + end end end |