Sha256: 98bb61c6b04dc683ec1f3dc1b234fd0b2ce4a7d2aa0ef43ecfd5e723979c535a

Contents?: true

Size: 1.54 KB

Versions: 29

Compression:

Stored size: 1.54 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) } # rubocop:disable Lint/NonAtomicFileOperation
    rescue Errno::EEXIST
      check_pid
      retry
    end

    # @return [void]
    def delete_pid
      File.delete(pidfile) if File.exist?(pidfile) # rubocop:disable Lint/NonAtomicFileOperation
    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

29 entries across 29 versions & 1 rubygems

Version Path
good_job-3.24.0 lib/good_job/daemon.rb
good_job-3.23.0 lib/good_job/daemon.rb
good_job-3.22.0 lib/good_job/daemon.rb
good_job-3.21.5 lib/good_job/daemon.rb
good_job-3.21.4 lib/good_job/daemon.rb
good_job-3.21.3 lib/good_job/daemon.rb
good_job-3.21.2 lib/good_job/daemon.rb
good_job-3.21.1 lib/good_job/daemon.rb
good_job-3.21.0 lib/good_job/daemon.rb
good_job-3.20.0 lib/good_job/daemon.rb
good_job-3.19.4 lib/good_job/daemon.rb
good_job-3.19.3 lib/good_job/daemon.rb
good_job-3.19.2 lib/good_job/daemon.rb
good_job-3.19.1 lib/good_job/daemon.rb
good_job-3.19.0 lib/good_job/daemon.rb
good_job-3.18.3 lib/good_job/daemon.rb
good_job-3.18.2 lib/good_job/daemon.rb
good_job-3.18.1 lib/good_job/daemon.rb
good_job-3.18.0 lib/good_job/daemon.rb
good_job-3.17.4 lib/good_job/daemon.rb