ManageIQ/manageiq

View on GitHub
lib/pid_file.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
96%
require 'miq-process'

class PidFile
  def initialize(fname)
    @fname = fname
  end

  def self.create(fname, remove_on_exit = true)
    new(fname).create(remove_on_exit)
  end

  def self.remove(fname)
    new(fname).remove
  end

  def pid
    return nil unless File.file?(@fname)

    data = File.read(@fname).strip
    return nil if data.empty? || !/\d+/.match(data)

    data.to_i
  end

  def remove
    FileUtils.rm(@fname) if pid == Process.pid
  end

  def create(remove_on_exit = true)
    FileUtils.mkdir_p(File.dirname(@fname))
    File.open(@fname, "w") { |f| f.write(Process.pid) }
    at_exit { PidFile.remove(@fname) } if remove_on_exit
  end

  def running?(regexp = nil)
    pid = self.pid
    return false if pid.nil?

    command_line = MiqProcess.command_line(pid)
    return false if command_line.blank?

    unless regexp.nil?
      regexp = Regexp.new(regexp) if regexp.kind_of?(String)
      return false if regexp.match(command_line).nil?
    end

    true
  end
end