Sha256: d57d1cf49ce24fafb2db5f5193add541f35fae4a1cfcd5ffbf54109b94114170

Contents?: true

Size: 1.45 KB

Versions: 38

Compression:

Stored size: 1.45 KB

Contents

# frozen_string_literal: true
module GoodJob
  #
  # Manages daemonization of the current process.
  #
  class Daemon
    # The path of the generated pidfile.
    # @return [Pathname,String]
    attr_reader :pidfile

    # @param pidfile [Pathname,String] Pidfile path
    def initialize(pidfile:)
      @pidfile = pidfile
    end

    # Daemonizes the current process and writes out a pidfile.
    # @return [void]
    def daemonize
      check_pid
      ::Process.daemon
      write_pid
    end

    private

    # @return [void]
    def write_pid
      File.open(pidfile, ::File::CREAT | ::File::EXCL | ::File::WRONLY) { |f| f.write(::Process.pid.to_s) }
      at_exit { File.delete(pidfile) if File.exist?(pidfile) }
    rescue Errno::EEXIST
      check_pid
      retry
    end

    # @return [void]
    def delete_pid
      File.delete(pidfile) if File.exist?(pidfile)
    end

    # @return [void]
    def check_pid
      case pid_status(pidfile)
      when :running, :not_owned
        abort "A server is already running. Check #{pidfile}"
      when :dead
        File.delete(pidfile)
      end
    end

    # @param pidfile [Pathname, String]
    # @return [Symbol]
    def pid_status(pidfile)
      return :exited unless File.exist?(pidfile)

      pid = ::File.read(pidfile).to_i
      return :dead if pid.zero?

      ::Process.kill(0, pid) # check process status
      :running
    rescue Errno::ESRCH
      :dead
    rescue Errno::EPERM
      :not_owned
    end
  end
end

Version data entries

38 entries across 38 versions & 1 rubygems

Version Path
good_job-3.2.0 lib/good_job/daemon.rb
good_job-3.1.0 lib/good_job/daemon.rb
good_job-3.0.2 lib/good_job/daemon.rb
good_job-3.0.1 lib/good_job/daemon.rb
good_job-3.0.0 lib/good_job/daemon.rb
good_job-2.99.0 lib/good_job/daemon.rb
good_job-2.17.1 lib/good_job/daemon.rb
good_job-2.17.0 lib/good_job/daemon.rb
good_job-2.16.1 lib/good_job/daemon.rb
good_job-2.16.0 lib/good_job/daemon.rb
good_job-2.15.2 lib/good_job/daemon.rb
good_job-2.15.1 lib/good_job/daemon.rb
good_job-2.15.0 lib/good_job/daemon.rb
good_job-2.14.4 lib/good_job/daemon.rb
good_job-2.14.3 lib/good_job/daemon.rb
good_job-2.14.2 lib/good_job/daemon.rb
good_job-2.14.1 lib/good_job/daemon.rb
good_job-2.14.0 lib/good_job/daemon.rb
good_job-2.13.2 lib/good_job/daemon.rb
good_job-2.13.1 lib/good_job/daemon.rb