Ticket #11591: killdefunctor.pl

File killdefunctor.pl, 1.5 KB (added by Mark Spieth, 8 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