Ticket #11591: killdefunctor.pl

File killdefunctor.pl, 1.5 KB (added by Mark Spieth, 13 years ago)
Line 
1#!/usr/bin/perl
2
3use strict;
4use POSIX ":sys_wait_h";
5
6my $prevpid = 0;
7my $prevpidcnt = 0;
8while (1)
9{
10 my %procs;
11 my %procnames;
12 open F, "ps ax|";
13 while (<F>)
14 {
15 chomp;
16 my ($pid, $ppid, $cmd) = /\s+(\d+)\s+(\d+).*\s(\S+)$/;
17 $pid = $pid + 0;
18 $ppid = $ppid + 0;
19 #print "$pid $ppid $cmd\n";
20 $procs{$pid} = $ppid;
21 $procnames{$pid} = $cmd;
22 }
23 my $nprevpid = $prevpid;
24 my $found = 0;
25 foreach my $pid (keys %procnames)
26 {
27 #print "testing $procnames{$pid}\n";
28 if ($procnames{$pid} eq '<defunct>')
29 {
30 #system("cmd /c \"taskkill /F /IM $pid\"");
31 if ($procs{$pid} == 1)
32 {
33 #print "waiting for $pid ... ";
34 #my $kid = waitpid(-1, WNOHANG);
35 #my $kid = waitpid(-1, 0);
36 #print "waited for $pid ret $kid\n";
37 system("cmd /c \"taskkill /F /IM $pid\"");
38 next;
39 }
40 #print "found defunct $pid '$procs{$pid}'\n";
41 if (defined($procs{$procs{$pid}}))
42 {
43 $found = 1;
44 if ($nprevpid == $procs{$pid})
45 {
46 $prevpidcnt++;
47 print "check $procs{$pid} $prevpidcnt\n";
48 if ($prevpidcnt >= 21)
49 {
50 print "kill -KILL $procs{$pid}\n";
51 system("kill -KILL $procs{$pid}");
52 }
53 elsif ($prevpidcnt >= 20)
54 {
55 print "kill $procs{$pid}\n";
56 #system("kill $procs{$pid}");
57 system("cmd /c \"taskkill /F /IM $pid\"");
58 #$prevpid = 0;
59 #$prevpidcnt = 0;
60 }
61 }
62 else
63 {
64 print "first $procs{$pid}\n";
65 $prevpid = $procs{$pid};
66 $prevpidcnt = 0;
67 }
68 last;
69 }
70 }
71 }
72 if ($found != 1)
73 {
74 $prevpid = 0;
75 }
76 sleep 1;
77 #last;
78}
79