Module: PidLock

Defined in:
lib/pid_lock.rb,
lib/pid_lock/version.rb

Constant Summary collapse

VERSION =
"0.1.2"

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.pid_pathObject



7
8
9
# File 'lib/pid_lock.rb', line 7

def pid_path
  @pid_path || "tmp/pid_locks"
end

Class Method Details

.ensure_single_running(pid_name) ⇒ Object



11
12
13
14
15
16
17
18
19
# File 'lib/pid_lock.rb', line 11

def ensure_single_running(pid_name)
  return if locked?(pid_name)
  PidLock.lock(pid_name)
  begin
    yield
  ensure
    PidLock.unlock(pid_name)
  end
end

.lock(pid_name) ⇒ Object



21
22
23
24
# File 'lib/pid_lock.rb', line 21

def lock(pid_name)
  Dir.exist?(pid_path) || FileUtils.mkdir_p(pid_path)
  File.write(File.join(pid_path, "#{pid_name}.pid"), $PID)
end

.locked?(pid_name) ⇒ Boolean

Returns:

  • (Boolean)


26
27
28
29
30
31
32
33
34
35
# File 'lib/pid_lock.rb', line 26

def locked?(pid_name)
  return false unless File.exist?(File.join(pid_path, "#{pid_name}.pid"))
  begin
    Process.kill(0, pid(pid_name))
    return true
  rescue StandardError
    self.unlock(pid_name)
    return false
  end
end

.pid(pid_name) ⇒ Object



48
49
50
# File 'lib/pid_lock.rb', line 48

def pid(pid_name)
  File.read(File.join(pid_path, "#{pid_name}.pid")).to_i
end

.stop(pid_name) ⇒ Object



37
38
39
40
41
42
43
44
45
46
# File 'lib/pid_lock.rb', line 37

def stop(pid_name)
  return unless File.exist?(File.join(pid_path, "#{pid_name}.pid"))
  pid = File.read(File.join(pid_path, "#{pid_name}.pid"))
  return if pid.to_s.empty?
  begin
    Process.kill("TERM", pid.to_i)
  rescue StandardError
  end
  unlock(pid_name)
end

.unlock(pid_name) ⇒ Object



52
53
54
55
56
# File 'lib/pid_lock.rb', line 52

def unlock(pid_name)
  if File.exist?(File.join(pid_path, "#{pid_name}.pid"))
    File.delete(File.join(pid_path, "#{pid_name}.pid"))
  end
end