#!/usr/bin/env ruby require 'rubygems' require 'daemons' options = {} options[:log_output] = true options[:dir] = File.expand_path('../../log/', __FILE__) options[:dir_mode] = :normal Daemons.run_proc('PassengerMonitor', options) do command = 'sudo passenger-memory-stats' memory_limit = 250 def running?(pid) begin return Process.getpgid(pid) != -1 rescue Errno::ESRCH return false end end loop do `#{command}`.each_line do |line| next unless /(\d+)\s+\d+\s+(\d+\.\d+)\s+MB\s+(\d+\.\d+)\s+MB\s+Rails:/.match(line) all, pid, vm_size, private = $~.to_a if private.to_i > memory_limit puts "#{Time.now}: Killing #{pid}, memory usage == #{private}" Process.kill("SIGUSR1", pid.to_i) puts "Finished kill attempt. Sleeping for 20 seconds to give it time to die..." sleep 20 if running?(pid.to_i) puts "Process is still running - die bitch" Process.kill("KILL", pid.to_i) end else puts "Process ##{pid} is not above limit (#{private}MB)" end sleep 120 end end end