mysql_zap.sh
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. #!@PERL@
  2. # This is a utility for MySQL. It is not needed by any standard part
  3. # of MySQL.
  4. # Usage: mysql_zap [-signal] [-f] [-t] pattern
  5. # Configuration parameters.
  6. $sig = ""; # Default to try all signals
  7. $ans = "y";
  8. $opt_f= 0;
  9. $opt_t= 0;
  10. $opt_a = "";
  11. $BSD = -f '/vmunix' || $ENV{"OS"} eq "SunOS4";
  12. $LINUX = $^O eq 'linux';
  13. $pscmd = $BSD ? "/bin/ps -auxww" : $LINUX ? "/bin/ps axuw" : "/bin/ps -ef";
  14. open(TTYIN, "</dev/tty") || die "can't read /dev/tty: $!";
  15. open(TTYOUT, ">/dev/tty") || die "can't write /dev/tty: $!";
  16. select(TTYOUT);
  17. $| = 1;
  18. select(STDOUT);
  19. $SIG{'INT'} = 'cleanup';
  20. while ($#ARGV >= $[ && $ARGV[0] =~ /^-/) {
  21.     if ($ARGV[0] =~ /(ZERO|HUP|INT|QUIT|ILL|TRAP|ABRT|EMT|FPE|KILL|BUS|SEGV|SYS|PIPE|ALRM|TERM|URG|STOP|TSTP|CONT|CLD|TTIN|TTOU|IO|XCPU|XFSZ|VTALRM|PROF|WINCH|LOST|USR1|USR2)/ || $ARGV[0] =~ /-(d+)$/) {
  22. $sig = $1;
  23.     } elsif ($ARGV[0] eq "-f") {
  24. $opt_f=1;
  25.     } elsif ($ARGV[0] eq "-t") {
  26. $opt_t=1;
  27. $ans = "n";
  28.     }
  29.     elsif ($ARGV[0] eq "-a")
  30.     {
  31. $opt_a = 1;
  32.     }
  33.     elsif ($ARGV[0] eq "-?" || $ARGV[0] eq "-I")
  34.     {
  35. &usage;
  36.     }
  37.     else {
  38. print STDERR "$0: illegal argument $ARGV[0] ignoredn";
  39.     }
  40.     shift;
  41. }
  42. &usage if $#ARGV < 0;
  43. if (!$opt_f)
  44. {
  45.     if ($BSD) {
  46. system "stty cbreak </dev/tty >/dev/tty 2>&1";
  47.     }
  48.     else {
  49. system "stty", 'cbreak',
  50. system "stty", 'eol', '^A';
  51.     }
  52. }
  53. open(PS, "$pscmd|") || die "can't run $pscmd: $!";
  54. $title = <PS>;
  55. print TTYOUT $title;
  56. # Catch any errors with eval.  A bad pattern, for instance.
  57. eval <<'EOF';
  58. process: while ($cand = <PS>)
  59. {
  60.     chop($cand);
  61.     ($user, $pid) = split(' ', $cand);
  62.     next if $pid == $$;
  63.     $found = !@ARGV;
  64.     if ($opt_a) { $found = 1; }
  65.     foreach $pat (@ARGV)
  66.     {
  67. if ($opt_a)
  68. {
  69.     if (! ($cand =~ $pat))
  70.     {
  71. next process;
  72.     }
  73. }
  74. else
  75. {
  76.     $found = 1 if $cand =~ $pat;
  77. }
  78.     }
  79.     next if (!$found);
  80.     if (! $opt_f && ! $opt_t)
  81.     {
  82. print TTYOUT "$cand? ";
  83. read(TTYIN, $ans, 1);
  84. print TTYOUT "n" if ($ans ne "n");
  85.     }
  86.     else
  87.     {
  88. print TTYOUT "$candn";
  89.     }
  90.     if ($ans =~ /^y/i) { &killpid($sig, $pid); }
  91.     if ($ans =~ /^q/i) { last; }
  92. }
  93. EOF
  94. &cleanup;
  95. sub usage {
  96.     print <<EOF;
  97. Usage:   $0 [-signal] [-?Ift] pattern
  98. Options: -I or -? "info"  -f "force" -t "test".
  99. Version 1.0
  100. Kill processes with matches pattern.
  101. If -f isn't given, ask user for confirmation for each process to kill.
  102. If signal isn't given, try first with signal 15 and after that with signal 9.
  103. If -t is given the processes is only shown on stdout.
  104. EOF
  105.     exit(1);
  106. }
  107. sub cleanup {
  108.     if ($BSD) {
  109. system "stty -cbreak </dev/tty >/dev/tty 2>&1";
  110.     }
  111.     else {
  112. system "stty", 'icanon';
  113. system "stty", 'eol', '^@';
  114.     }
  115.     print "n";
  116.     exit;
  117. }
  118. sub killpid {
  119.     local($signal,$pid) = @_;
  120.     if ($signal)
  121.     {
  122. kill $signal,$pid;
  123.     }
  124.     else
  125.     {
  126. print "kill -15n";
  127. kill 15, $pid;
  128. for (1..5) {
  129.     sleep 2;
  130.     return if kill(0, $pid) == 0;
  131. }
  132. print "kill -9n";
  133. kill 9, $pid;
  134. for (1..5) {
  135.     sleep 2;
  136.     return if kill(0, $pid) == 0;
  137. }
  138. print "$pid will not die!n";
  139.     }
  140. }