#!/usr/bin/perl # run as www-data (same as /run/hilis4/*.pid owner) # perl script/kidreaper.pl # adapted from http://www.catalystframework.org/calendar/2007/18: # * changed kB to MB # * used IPC::System::Simple to capture ppid from service-name use lib '/home/raj/perl5/lib/perl5'; use IPC::System::Simple qw(capture); use Data::Printer; use Modern::Perl; my ($service, $max_mb) = @ARGV; die "Usage: $0 \n" unless $service && $max_mb; my $ppid = capture("cat /run/hilis4/$service.pid") or die $!; # p $ppid; my $cmd = sprintf '/bin/ps -o pid=,vsz= --ppid %s|', $ppid; if ( open (my $kids, $cmd) ) { my @goners; while (<$kids>) { chomp; my ($pid, $mem) = split; # p $mem; # ps shows KB. we want MBytes. $mem /= 1024; if ($mem >= $max_mb) { say sprintf "process %s mem [%s MB] > permitted [%s MB]", $pid, $mem, $max_mb; push @goners, $pid; } } close($kids); if (@goners) { # kill them slowly, so that all connection serving # children don't suddenly die at once. foreach my $victim (@goners) { # p $victim; kill 'HUP', $victim; # send Signal HangUp sleep 10; } } } else { die "Can't get process list: $!\n"; }