Class: Daemons::PidFile
Overview
What is a Pid-File?
A Pid-File is a file containing the process identification number (pid) that is stored in a well-defined location of the filesystem thus allowing other programs to find out the pid of a running script.
Daemons needs the pid of the scripts that are currently running in the background to send them so called signals. Daemons uses the TERM
signal to tell the script to exit when you issue a stop
command.
How does a Pid-File look like?
Pid-Files generated by Daemons have to following format:
<scriptname>_num<number>.pid
(Note that _num<number>
is omitted if only one instance of the script can run at any time)
Each file just contains one line with the pid as string (for example 6432
).
Where are the Pid-Files stored?
Daemons is configurable to store the Pid-Files relative to three different locations:
-
in a directory relative to the directory where the script (the one that is supposed to run as a daemon) resides (
:script
option for:dir_mode
) -
in a directory given by
:dir
(:normal
option for:dir_mode
) -
in the preconfigured directory
/var/run
(:system
option for:dir_mode
)
Constant Summary collapse
- DEFAULT_PID_DELIMITER =
'_num'
Instance Attribute Summary collapse
-
#dir ⇒ Object
readonly
Returns the value of attribute dir.
-
#multiple ⇒ Object
readonly
Returns the value of attribute multiple.
-
#number ⇒ Object
readonly
Returns the value of attribute number.
-
#pid_delimiter ⇒ Object
readonly
Returns the value of attribute pid_delimiter.
-
#progname ⇒ Object
readonly
Returns the value of attribute progname.
Class Method Summary collapse
Instance Method Summary collapse
- #cleanup ⇒ Object
- #exist? ⇒ Boolean
- #filename ⇒ Object
-
#initialize(dir, progname, multiple = false, pid_delimiter = nil) ⇒ PidFile
constructor
A new instance of PidFile.
- #pid ⇒ Object
- #pid=(p) ⇒ Object
- #zap ⇒ Object
Methods inherited from Pid
Constructor Details
#initialize(dir, progname, multiple = false, pid_delimiter = nil) ⇒ PidFile
Returns a new instance of PidFile.
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/daemons/pidfile.rb', line 66 def initialize(dir, progname, multiple = false, pid_delimiter = nil) @dir = File.(dir) @progname = progname @multiple = multiple @pid_delimiter = pid_delimiter || DEFAULT_PID_DELIMITER @number = nil @number = 0 if multiple if multiple while File.exist?(filename) && @number < 1024 @number += 1 end if @number >= 1024 fail RuntimeException('cannot run more than 1024 instances of the application') end end end |
Instance Attribute Details
#dir ⇒ Object (readonly)
Returns the value of attribute dir.
32 33 34 |
# File 'lib/daemons/pidfile.rb', line 32 def dir @dir end |
#multiple ⇒ Object (readonly)
Returns the value of attribute multiple.
32 33 34 |
# File 'lib/daemons/pidfile.rb', line 32 def multiple @multiple end |
#number ⇒ Object (readonly)
Returns the value of attribute number.
32 33 34 |
# File 'lib/daemons/pidfile.rb', line 32 def number @number end |
#pid_delimiter ⇒ Object (readonly)
Returns the value of attribute pid_delimiter.
32 33 34 |
# File 'lib/daemons/pidfile.rb', line 32 def pid_delimiter @pid_delimiter end |
#progname ⇒ Object (readonly)
Returns the value of attribute progname.
32 33 34 |
# File 'lib/daemons/pidfile.rb', line 32 def progname @progname end |
Class Method Details
.existing(path) ⇒ Object
54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/daemons/pidfile.rb', line 54 def self.existing(path) new_instance = PidFile.allocate new_instance.instance_variable_set(:@path, path) def new_instance.filename @path end new_instance end |
.find_files(dir, progname, delete = false, pid_delimiter = nil) ⇒ Object
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/daemons/pidfile.rb', line 34 def self.find_files(dir, progname, delete = false, pid_delimiter = nil) files = Dir[File.join(dir, "#{progname}#{pid_delimiter || DEFAULT_PID_DELIMITER}*.pid")] files = Dir[File.join(dir, "#{progname}.pid")] if files.size == 0 files.delete_if { |f| not (File.file?(f) and File.readable?(f)) } if delete files.delete_if do |f| pid = File.open(f) { |h| h.read }.to_i rsl = !Pid.running?(pid) if rsl begin; File.unlink(f); rescue ::Exception; end yield(pid, f) if block_given? end rsl end end files end |
Instance Method Details
#cleanup ⇒ Object
101 102 103 |
# File 'lib/daemons/pidfile.rb', line 101 def cleanup File.delete(filename) if pid == Process.pid end |
#exist? ⇒ Boolean
90 91 92 |
# File 'lib/daemons/pidfile.rb', line 90 def exist? File.exist? filename end |
#filename ⇒ Object
85 86 87 88 |
# File 'lib/daemons/pidfile.rb', line 85 def filename suffix = "#{pid_delimiter}#{@number}" if @number File.join(@dir, "#{@progname}#{suffix}.pid") end |
#pid ⇒ Object
109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/daemons/pidfile.rb', line 109 def pid begin File.open(filename) do |f| p = f.gets.to_i return nil if p == 0 # Otherwise an invalid pid file becomes pid 0 return p end rescue ::Exception return nil end end |
#pid=(p) ⇒ Object
94 95 96 97 98 99 |
# File 'lib/daemons/pidfile.rb', line 94 def pid=(p) File.open(filename, 'w') do |f| f.chmod(0644) f.puts p # Process.pid end end |
#zap ⇒ Object
105 106 107 |
# File 'lib/daemons/pidfile.rb', line 105 def zap File.delete(filename) if exist? end |