From e73de9397d110a1442e3717823605d3020016b17 Mon Sep 17 00:00:00 2001
From: Elvin Efendi <elvin.efendiev@shopify.com>
Date: Fri, 4 Dec 2015 13:39:10 -0500
Subject: do not start new instance when there is one running

---
 lib/oxidized/cli.rb | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)

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
-- 
cgit v1.2.3