module Thin::Daemonizable::ClassMethods

Public Instance Methods

force_kill(pid, pid_file) click to toggle source
# 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) click to toggle source

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.

# 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() click to toggle source
# File lib/thin/daemonizing.rb, line 130
def monotonic_time
  Process.clock_gettime(Process::CLOCK_MONOTONIC)
end
read_pid_file(file) click to toggle source
# 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) click to toggle source

Restart the server by sending HUP signal.

# File lib/thin/daemonizing.rb, line 126
def restart(pid_file)
  send_signal('HUP', pid_file)
end
send_signal(signal, pid_file, timeout=60) click to toggle source

Send a signal to the process which PID is stored in pid_file.

# 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