#!/bin/sh

#
# killold
#
# Le tueur de vieux processus	( à mettre dans le cron.hourly )
#
# Par Julien MOREAU		( jmoreau@bigfoot.com )
#
# Création:	jm	03/10/2000
#

hmax=10				# Age maxi d'un processus (en heure)

appli=""			# Application à tuer (zéro ou une)
# Si on s'en moque, laisser une chaine vide

group2kill="^isty[12]$"		# Groupe des processus pouvant etre tués
# Ceci est une expression régulière (un grep est utilisé)

nbps=0				# Nombre de paramètres souhaités (sans option)
cmd=`basename $0`		# Nom de la commande
usage="Usage: $cmd [-h]"	# Message d'aide
usage=$usage"\n\tAffiche ce message d'aide.\n"
usage=$usage"\nUsage: $cmd <filename> [<param2> ...]"
usage=$usage"\n\tTue les vieux processus utilisateurs."
usage=$usage"\n\t(cette commande est à lancer en tant que root)."

if test `uname` != "HP-UX" ; then e="-e" ; fi

if [ $# -ne $nbps -o "$1" = "-h" ] ; then	# Vérifie le nb de paramètres
	echo $e $usage 1>&2 ; exit 1	# Affichage aide puis arrêt
fi

export LANG=fr_FR.iso88591 ; export LC_CTYPE=french.iso88591

set 1 `date` ; shift ; time="$5"
hnow=`echo $time|cut -d: -f1`
echo "Current hour: $hnow"

ps -fe | tail -n+2 | grep "$appli" | grep -v ^root | while read ligne
do
	set 1 $ligne ; shift
	if [ $# -lt 8 ] ; then continue ; fi

	user=$1 ; pid=$2 ; ppid=$3 ; stime=$5 ; tty=$6 ; itime=$7 ; cmde=$8

	h=`echo $stime|cut -d: -f1`	# Heure à laquelle il a été lancé
	echo $h|grep -q [1-9]
	if [ $? -ne 0 ] ; then h=-100 ; fi
	age=`expr $hnow - $h`		# Age en heure du processus
	if [ $? -ne 0 ] ; then age=1000 ; fi
	if [ $age -lt 0 ] ; then age=`expr $age + 24` ; fi

	passwdline=`grep ^$user /etc/passwd`
	#uid=`echo $passwdline|cut -d: -f3`
	gid=`echo $passwdline|cut -d: -f4`
	group=`grep :$gid: /etc/group|cut -d: -f1`

	echo $group | grep -q $group2kill ; group_ok=$?

	if [ $group_ok -eq 0 -a $age -ge $hmax ] ; then
		prog=`ps -u $1|grep $pid|cut -c23-`	# Nom du programme
		echo $e "user=$user\tgroup=$group\t\c"
		echo $e "stime=$stime\tage=${age}h\tprog=$prog"
		if test `whoami` = root ; then kill -9 $pid ; fi
	fi
done

exit 0		# Sortie sans erreur

