diff --git a/xCAT-server-2.0/lib/xcat/plugins/blade.pm b/xCAT-server-2.0/lib/xcat/plugins/blade.pm
index 47dd67da4..2eb951c2f 100644
--- a/xCAT-server-2.0/lib/xcat/plugins/blade.pm
+++ b/xCAT-server-2.0/lib/xcat/plugins/blade.pm
@@ -9,6 +9,7 @@ use xCAT::Usage;
 use IO::Socket;
 use SNMP;
 use strict;
+my %mm_comm_pids;
 
 use XML::Simple;
 if ($^O =~ /^linux/i) {
@@ -1276,6 +1277,13 @@ sub preprocess_request {
 
 
 sub process_request { 
+  $SIG{INT} = $SIG{TERM} = sub { 
+     foreach (keys %mm_comm_pids) {
+        kill 2, $_;
+     }
+     exit 0;
+  };
+
   my $request = shift;
   my $callback = shift;
   my $doreq = shift;
@@ -1384,7 +1392,7 @@ sub process_request {
 
 
   my $children = 0;
-  $SIG{CHLD} = sub { while (waitpid(-1, WNOHANG) > 0) { $children--; } };
+  $SIG{CHLD} = sub { my $cpid; while ($cpid = waitpid(-1, WNOHANG) > 0) { delete $mm_comm_pids{$cpid}; $children--; } };
   my $inputs = new IO::Select;;
   foreach my $info (@$moreinfo) {
     $info=~/^\[(.*)\]\[(.*)\]\[(.*)\]/;
@@ -1424,6 +1432,7 @@ sub process_request {
       dompa($pfd,$mpa,\%mpahash,$command,-args=>\@exargs);
       exit(0);
     }
+    $mm_comm_pids{$cpid} = 1;
     close ($pfd);
     $sub_fds->add($cfd);
   }
diff --git a/xCAT-server-2.0/sbin/xcatd b/xCAT-server-2.0/sbin/xcatd
index f1519e15b..43ad1cb9b 100755
--- a/xCAT-server-2.0/sbin/xcatd
+++ b/xCAT-server-2.0/sbin/xcatd
@@ -784,7 +784,7 @@ sub dispatch_request {
    }
 
   my $childrn=0;
-  $SIG{CHLD} = sub {my $cpid; while ($cpid =waitpid(-1, WNOHANG) > 0) { undef $dispatched_children{$cpid}; $childrn--; } };
+  $SIG{CHLD} = sub {my $cpid; while ($cpid =waitpid(-1, WNOHANG) > 0) { delete $dispatched_children{$cpid}; $childrn--; } };
    foreach (@{$reqs}) {
     my $pfd;
     my $parfd; #use a private variable so it won't trounce itself recursively