Module: Thin::Daemonizable::ClassMethods
- Defined in:
- lib/thin/daemonizing.rb
Instance Method Summary collapse
- #force_kill(pid, pid_file) ⇒ Object
-
#kill(pid_file, timeout = 60) ⇒ Object
Send a QUIT or INT (if timeout is
0
) signal the process which PID is stored inpid_file
. - #monotonic_time ⇒ Object
- #read_pid_file(file) ⇒ Object
-
#restart(pid_file) ⇒ Object
Restart the server by sending HUP signal.
-
#send_signal(signal, pid_file, timeout = 60) ⇒ Object
Send a
signal
to the process which PID is stored inpid_file
.
Instance Method Details
#force_kill(pid, pid_file) ⇒ Object
160 161 162 163 164 |
# File 'lib/thin/daemonizing.rb', line 160 def force_kill(pid, pid_file) Logging.log_info "Sending KILL signal to process #{pid} ... " Process.kill("KILL", pid) File.delete(pid_file) if File.exist?(pid_file) end |
#kill(pid_file, timeout = 60) ⇒ Object
Send a QUIT or INT (if timeout is 0
) signal the process which PID is stored in pid_file
. If the process is still running after timeout
, KILL signal is sent.
117 118 119 120 121 122 123 |
# File 'lib/thin/daemonizing.rb', line 117 def kill(pid_file, timeout=60) if timeout == 0 send_signal('INT', pid_file, timeout) else send_signal('QUIT', pid_file, timeout) end end |
#monotonic_time ⇒ Object
130 131 132 |
# File 'lib/thin/daemonizing.rb', line 130 def monotonic_time Process.clock_gettime(Process::CLOCK_MONOTONIC) end |
#read_pid_file(file) ⇒ Object
166 167 168 169 170 171 172 |
# File 'lib/thin/daemonizing.rb', line 166 def read_pid_file(file) if File.file?(file) && pid = File.read(file) pid.to_i else nil end end |
#restart(pid_file) ⇒ Object
Restart the server by sending HUP signal.
126 127 128 |
# File 'lib/thin/daemonizing.rb', line 126 def restart(pid_file) send_signal('HUP', pid_file) end |
#send_signal(signal, pid_file, timeout = 60) ⇒ Object
Send a signal
to the process which PID is stored in pid_file
.
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
# File 'lib/thin/daemonizing.rb', line 135 def send_signal(signal, pid_file, timeout=60) if pid = read_pid_file(pid_file) Logging.log_info "Sending #{signal} signal to process #{pid} ... " Process.kill(signal, pid) # This loop seems kind of racy to me... started_at = monotonic_time while Process.running?(pid) sleep 0.1 raise Timeout::Error if (monotonic_time - started_at) > timeout end else raise PidFileNotFound, "Can't stop process, no PID found in #{pid_file}" end rescue Timeout::Error Logging.log_info "Timeout!" force_kill(pid, pid_file) rescue Interrupt force_kill(pid, pid_file) rescue Errno::ESRCH # No such process Logging.log_info "process not found!" force_kill(pid, pid_file) end |