Sha256: 55591417ece150d67e6a12bd75860c726df5737db1166dae56d207e332e5e53e

Contents?: true

Size: 1.76 KB

Versions: 36

Compression:

Stored size: 1.76 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_dir
      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_dir
      dirname = File.dirname(pidfile)
      return if Dir.exist?(dirname)

      abort "Pidfile directory \"#{dirname}\" doesn't exist. Aborting..."
    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

36 entries across 36 versions & 1 rubygems

Version Path
good_job-3.30.0 lib/good_job/daemon.rb
good_job-3.29.5 lib/good_job/daemon.rb
good_job-3.29.4 lib/good_job/daemon.rb
good_job-3.29.3 lib/good_job/daemon.rb
good_job-3.28.2 lib/good_job/daemon.rb
good_job-3.28.1 lib/good_job/daemon.rb
good_job-3.28.0 lib/good_job/daemon.rb
good_job-3.27.4 lib/good_job/daemon.rb
good_job-3.27.3 lib/good_job/daemon.rb
good_job-3.27.2 lib/good_job/daemon.rb
good_job-3.27.1 lib/good_job/daemon.rb
good_job-3.27.0 lib/good_job/daemon.rb
good_job-3.26.2 lib/good_job/daemon.rb
good_job-3.26.1 lib/good_job/daemon.rb
good_job-3.26.0 lib/good_job/daemon.rb
good_job-3.25.0 lib/good_job/daemon.rb