#!/usr/bin/perl =begin metadata Name: kill Description: send signals to a process Author: Theo Van Dinter, felicity@kluge.net License: =end metadata =cut # # An implementation of the 'kill' utility in Perl. Written for the Perl # Power Tools (PPT) project by Theo Van Dinter (felicity@kluge.net). use strict; use Config; use integer; # die if no signals or no arguments die "No signals defined ?!?" unless defined $Config{"sig_name"}; die "$0: Too few arguments; try $0 -h\n" unless ( @ARGV ); my(@signals) = split(/\s+/,$Config{"sig_name"}); my(%hsignals) = map { $_ => 1 } @signals; my($signal) = "TERM"; # default of SIGTERM if ( $ARGV[0] =~ /^-l$/i ) { # list signals for(my($i)=1;$i<=$#signals;$i++){ printf "%2d:%-6s%s",$i,$signals[$i], ( ($i % 8 == 0) || ($i == $#signals) )?"\n":" "; } exit 0; } elsif ( $ARGV[0] =~ /^-h$/i ) { # help me! print "usage: $0 [-s signalname] PIDS ... $0 [-signalname] PIDS ... $0 [-signalnumber] PIDS ... $0 PIDS ... $0 [-l] $0 [-h] "; exit 0; } elsif ( $ARGV[0] =~ /^-\d+$/ ) { # -signalnumber ($signal)=($ARGV[0]=~/^-(\d+)/); die "$0: Bad signal number.\n" if ( $signal > $#signals ); shift @ARGV; } elsif ( $ARGV[0] =~ /^-/ ) { # -NAME or -s NAME ($signal)=($ARGV[0]=~/^-(.+)$/); shift @ARGV; $signal = shift @ARGV if ( lc $signal eq "s" ); # -s has signalname param. $signal = uc $signal; $signal =~ s/^SIG//; # remove the "SIG" from SIGNAME die "$0: $signal: Unknown signal; $0 -l lists signals.\n" unless ( $hsignals{$signal} ); } die "$0: No PIDs specified.\n" unless ( @ARGV ); my($ret) = 0; foreach ( @ARGV ) { # do the kills... unless (kill $signal, $_) { warn "$0: $_: $!\n"; $ret = 1; } } exit $ret; =head1 NAME kill - send signals to a process =head1 SYNOPSIS B<kill> [ B<-s> I<signalname> C<PIDS ...> ] [ B<-signalname> C<PIDS ...> ] [ B<-signalnumber> C<PIDS ...> ] [ C<PIDS ...> ] [ B<-l> ] [ B<-h> ] =head1 DESCRIPTION B<kill> sends a signal to all PIDS specified on the command line. This is typically done to cause a process to terminate and/or to reload configuration files, etc. Signal handlers are specified per program, so the effects of a received signal may vary. =head1 OPTIONS AND ARGUMENTS =over 4 =item I<-s> This parameter takes a single argument of a signal name (see -l) to be sent to the specified PIDs. =item I<-signalname> A short form of the C<-s signalname> parameter. =item I<-signalnumber> This parameter specifies that the given signal number should be sent to the specified PID listing. =item I<-l> Display a listing of all available signals on the current system. =item I<-h> Display the usage help message. =back =head1 NOTES If no signal is specified on the command line, SIGTERM is sent to the specified PIDs. kill returns 0 on success or >0 if an error occurred. kill is built-in to csh(1); See csh(1) for details. Only the super-user may send signals to other users' processes. This version of kill does not support I<-l [signal]> since there didn't seem to be any use to the parameter (it didn't work on any platform I tried either.) Signal names may have the I<SIG> prefix. i.e.: C<kill -HUP> and C<kill -SIGHUP> are equivalent. The signal list C<kill -l> displays in an "extended" form which lists both the signal name and the signal number for easy reference. =head1 HISTORY Perl version rewritten for the Perl Power Tools project from the description of the kill program in OpenBSD. =head1 AUTHOR Theo Van Dinter (felicity@kluge.net) =head1 SEE ALSO csh(1), ps(1), kill(2)