Return to BSD News archive
Path: euryale.cc.adfa.oz.au!newshost.anu.edu.au!harbinger.cc.monash.edu.au!news.cs.su.oz.au!metro!metro!munnari.OZ.AU!news.ecn.uoknor.edu!solace!nntp.uio.no!news.cais.net!nntp.crosslink.net!news.magicnet.net!tarpit.thrush.com!usenet
From: rd@mail.thrush.com (R.D. Thrush)
Newsgroups: comp.unix.bsd.bsdi.misc
Subject: Re: FTPD hangs
Date: 09 May 1996 18:17:29 GMT
Organization: Thrush Consulting
Lines: 99
Message-ID: <RD.96May9141729@mail.thrush.com>
References: <4mqd5c$4be@hops.entertain.com>
NNTP-Posting-Host: localhost.thrush.com
To: dwatson@abwam.com (Darryl Watson)
In-reply-to: dwatson@abwam.com's message of 8 May 1996 15:04:12 GMT
>>>>> "dwatson" == Darryl Watson <dwatson@abwam.com> writes:
dwatson> I have been running with BSDi 2.0 with patches, and lately
dwatson> been having a problem with ftpd.
dwatson> I find that I have to clear out swapped out ftpd's every day,
dwatson> even though I have '-t 15 -T 120' in the /etc/inetd.conf for
dwatson> ftpd.
dwatson> Has anyone seen this problem? If so, what did you do (if
dwatson> anything) to fix it?
I've been using the attached script out of cron once an hour on a
bsdi 1.1 system for the past several months. You'll need to adjust it
to suit your criteria/policy.
#! /usr/local/bin/perl
# Kill any ftpd that was started more than n hours ago and is
# in IW state.
$min_threshold=60; # How old (minutes) an ftpd process can be
@mn = ('Jan','Feb','Mar','Apr','May','Jun',
'Jul','Aug','Sep','Oct','Nov','Dec');
foreach $arg (@ARGV) {
$debug=1 if $arg eq '-d';
$verbose=1 if $arg eq '-v';
}
if ($debug) {
open(PS, "<& STDIN") || die "Can't open debug file: $!";
$_ = <PS>;
(undef,$min,$hour) = split;
} else {
$logfile="/var/log/ftpd.idle.log";
open(PS, "ps axo user,pid,start,state,ucomm,time |")
|| die "Can't invoke ps: $!";
(undef,$min,$hour) = localtime(time);
}
$now=sprintf("%02d%02d", $hour, $min);
while(<PS>) {
($user,$pid,$start,$state,$ucomm)=split;
if($ucomm =~ /ftpd/ && $state=~ /^I/) {
$ampm=substr($start,-2,2);
if ($ampm =~ /AM|PM/) {
if ($start =~ /^(\d+):(\d+)[AP]M$/) {
($h,$m)= ($1,$2);
$h += 12 if $ampm eq 'PM';
$then=sprintf("%02d%02d", $h, $m);
$diff = $now - $then;
$diff += 2400 if $diff < 0;
if ($diff >= $min_threshold) {
$pids{$pid}=$_;
$diff{$pid}=$diff;
}
next;
}
}
$pids{$pid}=$_;
$diff{$pid}=9999;
}
}
close PS;
foreach $pid (keys %pids) {
$killcnt++;
push(@kills, $pid);
}
if ($verbose) {
if ($killcnt) {
print "Killing";
foreach $pid (@kills) { print " $pid"; }
print "\n";
}
}
exit(0) unless $killcnt;
if ($debug) {
open(MAIL, ">&STDOUT") || die "Can't append to stdout: $!";
} else {
open(MAIL, ">>$logfile") || die "Can't append to $logfile: $!";
}
print MAIL ×tamp, ":\n";
foreach $pid (keys %pids) {
$age=sprintf("%8.2f", $diff{$pid}/100.);
print MAIL "Age=$age: $pids{$pid}";
unless ($debug) {
$killed = kill 9, $pid;
print MAIL "Unsuccessful kill\n" unless $killed;
$exitcode=1;
}
}
close MAIL;
exit $exitcode;
sub timestamp {
my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) =
localtime(time);
sprintf("%.3s %2d, %4d %2d:%02d:%02d", $mn[$mon], $mday, $year+1900, $hour, $min, $sec);
}
--
Bob Thrush rd@thrush.com 407 425-4845/ FAX 841-8004