home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/perl
-
- $BSD = -f '/vmunix';
-
- $_ = $0;
- if ($_ =~ /KILL$/) {
- if ($#ARGV >= 0) {
- $_ .= ' ' . shift;
- }
- else {
- $_ .= ' appl';
- }
- }
-
- $ENV{'IFS'} = '' if $ENV{'IFS'}; # plug sh security hole
- $applbin = '/appl/bin';
- $ENV{'PATH'} = "$applbin:/bin:/usr/bin:/usr/local/bin";
-
- if (/xyz/) {
- do killsys('xyz');
- }
- elsif (/def/) {
- do killsys('def');
- }
- elsif (/abc/) {
- do killsys('abc');
- }
- elsif (/appl/) {
- @ARGV = ();
- do killsys('xyz');
- do killsys('def');
- do killsys('abc');
- do killipc();
- do killall();
- sleep 1; # give them a chance to die
- if (&count_attached()) {
- sleep 5; # give them a longer chance
- if (&count_attached()) {
- die <<CURTAINS;
- WARNING: I can't find all the processes with shared memory.
- CURTAINS
- }
- }
- }
- else {
- die "Usage: KILL subsystem [pids]";
- }
- exit 0;
-
- sub killsys {
- $sys = shift(@_);
- if ($sys =~ /xyz/) {
- $pat1 = ' xyzzy$| plugh$| plover$';
- $pat2 = 'xyzzy|plugh';
- }
- elsif ($sys =~ /def/) {
- $pat1 = ' def$| [a-zA-Z].def$';
- $pat2 = 'def';
- }
- elsif ($sys =~ /abc/) {
- $pat1 = ' abcdaemon$';
- $pat2 = 'abc';
- }
- else {
- die "Internal error, stopped";
- }
-
- # If no pids specified, make up our own list
-
- if ($#ARGV < 0) {
- if ($BSD) {
- open(PS, '/bin/ps axc|') || warn "Can't run ps\n";
- }
- else {
- open(PS, '/bin/ps -ef|') || warn "Can't run ps\n";
- }
-
- while (<PS>) {
- if ($BSD) {
- $pid = $_ + 0;
- }
- else {
- $pid = substr($_,9,6) + 0;
- $COMMAND = index($_,"COMMAND") if $COMMAND < 1;
- $_ = substr($_,$COMMAND);
- @ary = split;
- $_ = shift(@ary);
- s|.*/||;
- $_ = ' ' . $_;
- }
- push(ARGV,$pid) if $_ =~ $pat1;
- }
- warn "No $sys processes found.\n" unless @ARGV;
- close(PS);
- $checking = 0;
- }
- else {
- $checking++; # we'll need to check propriety
- }
-
- # now get info necessary for logging
-
- chop($date = `date`);
- $date =~ s/ [A-Z][DS]T 19[89][0-9]//;
- chop($whoami = `who am i`);
- $whoami =~ s/[ \t]+/ /g;
- $whoami =~ s/^[a-z]*!//;
-
- while ($pid = shift) {
- open(KILLLOG,">>/local/tmp/${sys}_kill_log");
- if ($checking && `/bin/ps -p$pid` !~ $pat2) {
- print KILLLOG $date, ' ', $whoami,
- " not allowed to kill ",$pid,"\n";
- print "$pid is not a $sys process!\n";
- }
- else {
- print KILLLOG $date, ' ', $whoami,
- ' killed ',$pid,"\n";
- $pid =~ /(.*)/;
- $pid = $1;
- kill 15, $pid; # Give 'em a shot across the bow.
- sleep(5); # I hope this is long enough...
- kill 9, $pid; # Deep six 'em.
- }
- close(KILLLOG);
- }
- }
-
- sub killipc {
- @goners = ();
- open(IPCS,"ipcs -a |") || warn "Can't run ipcs\n";
- while (<IPCS>) {
- $LSPID = index($_,'LSPID') unless $LSPID > 0;
- $LRPID = index($_,'LRPID') unless $LRPID > 0;
- $CPID = index($_,' CPID') unless $CPID > 0;
- $LPID = index($_,' LPID') unless $LPID > 0;
- $SEGSZ = index($_,'SEGSZ') unless $SEGSZ > 0;
- if (/^q/) {
- if ($LSPID > 0) {
- $pid = substr($_,$LSPID,6) + 0;
- $pid =~ /^(\d+)$/; # Untaint $pid.
- $pid = $1;
- push(@goners,$pid) if $pid > 1;
- }
- if ($LRPID > 0) {
- $pid = substr($_,$LSPID,6) + 0;
- $pid =~ /^(\d+)$/; # Untaint $pid.
- $pid = $1;
- push(@goners,$pid) if $pid > 1;
- }
- }
-
- elsif (/^m/) {
- next if substr($_,$SEGSZ,6) == 4096;
- if ($CPID > 0) {
- $pid = substr($_,$CPID,6) + 0;
- $pid =~ /^(\d+)$/; # Untaint $pid.
- $pid = $1;
- push(@goners,$pid) if $pid > 1;
- }
- if ($LPID > 0) {
- $pid = substr($_,$LPID,6) + 0;
- $pid =~ /^(\d+)$/; # Untaint $pid.
- $pid = $1;
- push(@goners,$pid) if $pid > 1;
- }
- }
- }
- close(IPCS);
-
- kill 9, @goners;
- }
-
- sub killall {
- @goners = ();
- if ($BSD) {
- open(PS, '/bin/ps axww|') || warn "Can't run ps\n";
- }
- else {
- open(PS, '/bin/ps -ef|') || warn "Can't run ps\n";
- }
- $head = <PS>;
- $COMMAND = index($head,"COMMAND") if $COMMAND <= 0;
- while (<PS>) {
- if ($BSD) {
- $pid = $_ + 0;
- }
- else {
- $pid = substr($_,9,6) + 0;
- }
- $cmd = substr($_,$COMMAND);
- @ary = split(' ',$cmd);
- $_ = shift(@ary);
- s|.*/||;
- if (/^(perl|csh|sh|\[.*\])$/) { # Ignore 1st argument?
- $_ = shift(@ary);
- s|.*/||;
- }
-
- $prog = $_;
- if (! -f "$applbin/$prog" && $cmd =~ /\((\w+)\)/) {
- $prog = $1;
- }
- if ($prog eq 'START'
- || $prog eq '.START'
- || $prog eq 'wall'
- || ($prog =~ /KILL$/ && $pid != $$)) {
- push(@finally,"$pid $prog");
- next;
- }
- next if $prog =~ /KILL$/;
- if (-f "$applbin/$prog") {
- $pid =~ /(.*)/;
- $pid = $1;
- push(goners,$pid);
- print "Killing $prog, pid $pid\n";
- }
- }
- close(PS);
-
- kill 15,@goners;
- sleep(5);
- kill 9,@goners;
-
- if ($#finally >= 0) {
- sleep(6);
- for (@finally) {
- ($pid,$prog) = split;
- $pid =~ /(\d+)/;
- $pid = $1;
- print "Killing $prog, pid $pid\n" if kill 9,$pid;
- }
- }
- }
-
- sub count_attached {
- $attached = 0;
- open(IPCS,"ipcs -a |") || warn "Can't run ipcs\n";
- $ipcrm = '';
- while (<IPCS>) {
- $SEGSZ = index($_,'SEGSZ') unless $SEGSZ > 0;
- $NATTCH = index($_,'NATTCH') unless $NATTCH > 0;
- $killnum = $1 if /^[msq]\s*(\d+)/;
- if (/^m/) {
- next if substr($_,$SEGSZ,6) == 4096;
- $ipcrm .= " -m $killnum";
- $attached += substr($_,$NATTCH,6) if $NATTCH > 0;
- }
- elsif (/^s/) {
- $ipcrm .= " -s $killnum";
- }
- elsif (/^q/) {
- $ipcrm .= " -q $killnum";
- }
- }
- close(IPCS);
- if ($ipcrm) {
- $ipcrm =~ /(.*)/;
- $ipcrm = $1;
- print "ipcrm$ipcrm\n";
- system "ipcrm$ipcrm";
- }
- $attached;
- }
-