Anthony Akens wrote:
>
> Hello,
Hello,
> I'm a sys-admin on an AIX (4.3) machine, and I'm trying to work
> with a vendor program that doesn't behave very nicely. Basically,
> if a user's connection to the server is inappropriately severed
> the application keeps right on chugging, leaving the user
> logged in. By inappropriately severed I mean if our link to the
> site the user is at goes down, which happens more often then
> I'd like, but that's a different problem.
BTDT but on DG/UX not AIX.
> Anyway, back to the question...
> There are quite a few problems with these unconnected sessions
> being stuck out there, not least of which is that they eat up a
> user license, which are pretty limited in amount. One good power
> outage or link failure at can make it so we're out of licenses.
> In that event the vendor says "Kill them by hand, do NOT automate
> the process" which is all fine and good except that we have
> several hundred users. That's a lot of time.
>
> The first thought was to use a shell idle logout time, but the
> program doesn't respond to the request and remains logged in.
>
> The previous administrator had made a shell script to check idle
> times and automatically log out the users, however since I've
> taken over the box the uptimes have been far greater (I don't
> believe in the same "reboot often" premise that he did) and now
> his script has shown a severe weakness: It's not written to
> handle longer PIDs.
>
> Rather then trying to fix his shell script, which is rather
> convoluted, I thought it would be a perfect candidate for perl,
> which I am just learning. If I post the script, can I get some
> pointers on re-writing it? Thanks for your time
>
> Here's the shell script, for those interested. Sorry for the
> lack of comments, but it's not to hard to figure out with a
> little patience...
>
> -----------
> PTS=`w -l | grep pts | cut -c10-15`
> echo "" >> /home/danb/killemresults
> RIGHTNOWDATE=`date`
> echo $RIGHTNOWDATE >> /home/danb/killemresults
> echo "Starting" >> /home/danb/killemresults
> for i in $PTS
> do
> #echo $i >> /home/danb/killemresults
> MINUTES=`w -l | grep -w $i | cut -c38-39`
> for j in $MINUTES
> do
> if (($j > 40))
> then
> PID=`ps -e | grep -w $i' ' | cut -c2-6`
> USERNAME=`w -l | grep -w $i`
> echo $USERNAME >> /home/danb/killemresults
> echo 'killing process id ' $PID ' on ' $i ' because minutes equal '
>$MINUTES >> /home/danb/killemresults
> kill -9 $PID
> fi
> done
> MINUTES=`w -l | grep -w $i | cut -c37`
> for j in $MINUTES
> do
> if [ "$j" = ":" ]
> then
> PID=`ps -e | grep -w $i' ' | cut -c2-6`
> USERNAME=`w -l | grep -w $i`
> echo $USERNAME >> /home/danb/killemresults
> echo 'killing process id ' $PID ' on ' $i ' because minutes greater than
>60 ' $MINUTES >> /home/danb/killemresults
> kill -9 $PID
> fi
> done
> done
#!/usr/bin/perl -w
use strict;
my $results = '/home/danb/killemresults';
open RES, '>>', $results or die "Cannot open $results: $!";
print "\n" . localtime() . "\nStarting\n";
for my $user ( map [ (split)[0,1,4] ], grep m|\bpts/|, `w -l` ) {
# print RES "$user->[1]\n";
my $pid = `ps -t $user->[1] -o pid`;
print RES "$user->[0]\n";
print RES "killing process id $pid on $user->[1] because minutes ";
print RES $user->[2] =~ /:/ ? 'greater than 60' : 'equal', " $user->[2]\n";
kill 9, $pid;
}
__END__
John
--
use Perl;
program
fulfillment
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]