#!/usr/bin/env perl # Copyright (c) 2009, Douglas Haber # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above # copyright notice, this list of conditions and the following # disclaimer in the documentation and/or other materials provided # with the distribution. # * The names names of the authors may not be used to endorse or # promote products derived from this software without specific # prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS # CONTRIBUTERS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS # CONTRIBUTERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. #killgrep # Send signal to all process that match a regular expression. # (Similar to pkill, but with less flexibility and better output.) # WARNING: This is very hackish and was writen when it was needed for # a particular situation. There almost definitely is a # better and safer way to get things done than using this script. # Be very careful if running as root or using regexs that # match too many processes. $REGEX = ""; $SIGNAL = ""; $0 = "killgrep"; sub display_help { print "USAGE:\n"; print " killgrep [signal] [regex]\n"; print " * if signal is 0 no signal is sent and \n"; print " all matching processes are listed.\n"; print " * if signal is not provided 2 is assumed\n"; exit(1); } sub valid_regex { # Check the validity of a regular expression eval { "" =~ /$_[0]/; return(1); } or return(0); } sub main { if($#ARGV==-1 || $#ARGV>1) { display_help(); } $REGEX = pop(@ARGV); if($#ARGV == -1) { $SIGNAL = 2; } else { $SIGNAL = int(pop(@ARGV)); } if(!valid_regex($REGEX)) { die "ERROR: Regular expression '$REGEX' is not valid.\n"; } foreach $line (split(/\n/, `ps awwx -o pid,cmd`)) { my ($pid, $cmd) = $line =~ /^\s*(\d+) (.*)$/; if($cmd =~ /$REGEX/) { printf("%-14.14s %s", "kill -$SIGNAL $pid", "# $cmd\n"); if($pid != $$ && $SIGNAL != 0) { kill($SIGNAL, $pid); } } } } main();