#!/usr/local/bin/perl
# -*-perl-*-

###########################
# zap - Killen nach Namen #
###########################
$parent = getppid;

# Erstes Argument kann Signalname/-nummer sein
$signal = $ARGV[0] =~ /^-(\w+)/ ?  (shift, $1) : 15;

# Dann folgen die Namen der zu killenden Prozesse
$egrep = join ('|', @ARGV) || die "Usage: $0 [ -sig ] prog ...\n";

# Das ps-Kommando bei Solaris 2 hat andere Optionen
$psall = -d "/kernel" ? "-u $<" : "x";

# Starte ps(1) für den Input und werfe die Überschrift weg
$psall = open (PS, "/bin/ps $psall |") || die "No /bin/ps.\n";

# Manchmal kann das ps nicht die Prozeßtabelle lesen und hängt
$SIG{'ALRM'}='timeout'; alarm (5); sub timeout { exit kill 9, $psall; };

for (<PS>; <PS>; ) {
	die "Strange ps: $_"
	    unless ($pid, $comd) = /^\s*(\d+)\D.*:\d+(.*)\n$/;
	kill ($signal, $pid) && print "Killing: $_" || warn "$!: $_\n"
	    if $comd =~ /$egrep/o && $pid != $$ && $pid != $parent;
}
