Skip to content

Instantly share code, notes, and snippets.

@shock
Forked from jsierles/gist:29838
Created May 29, 2009 20:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save shock/120186 to your computer and use it in GitHub Desktop.
Save shock/120186 to your computer and use it in GitHub Desktop.
Find bloating passengers and kill them gracefully.
#!/usr/bin/env ruby
#
# Find bloating passengers and kill them gracefully. Run from cron every minute.
#
# required for passenger since cron has no environment
ENV['HTTPD'] = 'httpd'
MEM_LIMIT = ARGV[0] || 500
module Process
def self.running?(pid)
begin
return Process.getpgid(pid) != -1
rescue Errno::ESRCH
return false
end
end
end
`passenger-memory-stats`.each_line do |line|
if line =~ /Rails: /
parts = line.split
pid, private_dirty_rss = parts[0].to_i, parts[4].to_f
if private_dirty_rss > MEM_LIMIT.to_i
puts "Found bloater #{pid} with size #{private_dirty_rss.to_s}"
puts "Killing with SIGUSR1 (graceful)..."
Process.kill("SIGUSR1", pid)
puts "Finished kill attempt. Sleeping for 8 seconds..."
sleep 8
if Process.running?(pid)
puts "Process is still running, so killing with extreme predjudice!"
Process.kill("TERM", pid)
end
puts "Done!"
end
end
end
@kuldeep-surendra
Copy link

kuldeep-surendra commented Dec 10, 2019

Why is SIGUSR1 used ? We can you SIGTERM for shutting down gracefully and SIGKILL to kill forcefully ?
Will this also work in passenger version 6 ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment