Sha256: 90972edf82794498ed12afc37edfabf3ee8f981f2e3542949a589e4f81df4683

Contents?: true

Size: 1.45 KB

Versions: 32

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

32 entries across 32 versions & 1 rubygems

Version Path
good_job-1.99.2 lib/good_job/daemon.rb
good_job-2.7.4 lib/good_job/daemon.rb
good_job-2.7.3 lib/good_job/daemon.rb
good_job-2.7.2 lib/good_job/daemon.rb
good_job-2.7.1 lib/good_job/daemon.rb
good_job-2.7.0 lib/good_job/daemon.rb
good_job-2.6.2 lib/good_job/daemon.rb
good_job-2.6.1 lib/good_job/daemon.rb
good_job-2.6.0 lib/good_job/daemon.rb
good_job-2.5.0 lib/good_job/daemon.rb
good_job-2.4.2 lib/good_job/daemon.rb
good_job-2.4.1 lib/good_job/daemon.rb
good_job-2.4.0 lib/good_job/daemon.rb
good_job-2.3.1 lib/good_job/daemon.rb
good_job-2.3.0 lib/good_job/daemon.rb
good_job-2.2.0 lib/good_job/daemon.rb
good_job-2.1.0 lib/good_job/daemon.rb
good_job-2.0.5 lib/good_job/daemon.rb
good_job-2.0.4 lib/good_job/daemon.rb
good_job-2.0.3 lib/good_job/daemon.rb