diff --git a/xCAT-rmc/plugin/rmcmon.pm b/xCAT-rmc/plugin/rmcmon.pm
index 93bf02556..276a23953 100644
--- a/xCAT-rmc/plugin/rmcmon.pm
+++ b/xCAT-rmc/plugin/rmcmon.pm
@@ -173,6 +173,9 @@ sub start {
       xCAT::Utils->runcmd("$::XCATROOT/sbin/rmcmon/rmcmetrixmon init $rsrc $rname $attrlist $minute", 0);
     }
   }
+  if(xCAT::Utils->isServiceNode()){
+    xCAT::Utils->runcmd("$::XCATROOT/sbin/rmcmon/rmcmetrixmon init rrdserver", 0);
+  }
   if ($scope) {
     #get a list of managed nodes
     $result=`/usr/bin/lsrsrc-api -s IBM.MngNode::::Name 2>&1`;  
@@ -273,7 +276,10 @@ sub stop {
   my $localhostname=hostname();
 
   
-  system("$::XCATROOT/sbin/rmcmon/rmcmetrixmon clean");
+  xCAT::Utils->runcmd("$::XCATROOT/sbin/rmcmon/rmcmetrixmon clean", 0);
+  if(xCAT::Utils->isServiceNode()){
+    xCAT::Utils->runcmd("$::XCATROOT/sbin/rmcmon/rmcmetrixmon clean rrdserver", 0);
+  } 
   my $result;
   chomp(my $pid= `/bin/ps -ef | /bin/grep rmcd | /bin/grep -v grep | /bin/awk '{print \$2}'`);
   if ($pid){
@@ -328,6 +334,7 @@ sub stop {
     #the identification of this node
     my @hostinfo=xCAT::Utils->determinehostname();
     my $isSV=xCAT::Utils->isServiceNode();
+
     my %iphash=();
     foreach(@hostinfo) {$iphash{$_}=1;}
     if (!$isSV) { $iphash{'noservicenode'}=1;}
diff --git a/xCAT-rmc/scripts/rmcmetrixmon b/xCAT-rmc/scripts/rmcmetrixmon
index 869013632..6561f20b1 100755
--- a/xCAT-rmc/scripts/rmcmetrixmon
+++ b/xCAT-rmc/scripts/rmcmetrixmon
@@ -115,6 +115,7 @@ if($cmd eq 'init'){
 	if ($ARGV[1] eq 'rrdserver'){
 		$code = xCAT_monitoring::rrdutil::start_RRD_server('13900', "/var/rrd/");
 		&err_handle($code, "can't start RRD server");
+		exit 0;
 	}
 	$minute = $ARGV[4];
 	$crontime = &getcrontime($minute);
@@ -127,6 +128,12 @@ if($cmd eq 'init'){
 		&err_handle($code, $msg);
 	}
 } elsif ($cmd eq 'clean'){
+	if ($ARGV[1] eq 'rrdserver'){
+		$code = xCAT_monitoring::rrdutil::stop_RRD_server();
+		&err_handle($code, "can't stop RRD server");
+		exit 0;
+	}
+
 	$msg = `rm -rf /var/rrd/*`; 
 	&err_handle($?, $msg);
 	@tabs = `/usr/bin/crontab -l 2>/dev/null;`;
diff --git a/xCAT-server/lib/xcat/monitoring/rrdutil.pm b/xCAT-server/lib/xcat/monitoring/rrdutil.pm
index 671b06131..3f4d3f64f 100755
--- a/xCAT-server/lib/xcat/monitoring/rrdutil.pm
+++ b/xCAT-server/lib/xcat/monitoring/rrdutil.pm
@@ -33,17 +33,30 @@ sub start_RRD_server
 	my @old = ();
 	my @new = ();
 	my $offset = 0;
+	my $found = 0;
 	@old = xCAT::Utils->runcmd("cat /etc/services", -2);
 	push @new, "rrdsrv $port/tcp #RRD server";
 	foreach (@old) {
 		if ($_ =~ /rrdsrv/){
-			splice(@old, $offset, 1, @new);
+			if(!$found){
+				splice(@old, $offset, 1, @new);
+				$found = 1;
+			} else {
+				splice(@old, $offset, 1);
+			}
 		} else {
 			$offset++;
 		}
 	}
+	
+	if(!$found){
+		push @old, @new;
+	}
+	
 	open FILE, ">/etc/services.new" or return -1;
-	print FILE @old;
+	foreach (@old){
+		print FILE "$_\n";
+	}
 	close FILE;
 	$cmd = "mv -f /etc/services.new /etc/services";
 	xCAT::Utils->runcmd($cmd, -2);
@@ -59,16 +72,27 @@ sub start_RRD_server
 	@new = ();
 	@old = xCAT::Utils->runcmd("cat /etc/inetd.conf", -2);
 	$offset = 0;
+	$found = 0;
 	push @new, "rrdsrv stream tcp no wait root /usr/bin/rrdtool rrdtool - $dir";
 	foreach (@old) {
 		if ($_ =~ /rrdsrv/){
-			splice(@old, $offset, 1, @new);
+			if(!$found){
+				splice(@old, $offset, 1, @new);
+				$found = 1;
+			} else {
+				splice(@old, $offset, 1);
+			}
 		} else {
 			$offset++;
 		}
 	}
+	if(!$found){
+		push @old, @new;
+	}
 	open FILE, ">/etc/inetd.conf.new" or return -1;
-	print FILE @old;
+        foreach (@old){
+                print FILE "$_\n";
+        }
 	close FILE;
 	xCAT::Utils->runcmd("mv -f /etc/inetd.conf.new /etc/inetd.conf", -2);
 
@@ -105,7 +129,9 @@ sub stop_RRD_server
 		}
 	}
 	open FILE, ">/etc/services.new" or return -1;
-	print FILE @old;
+        foreach (@old){
+                print FILE "$_\n";
+        }
 	close FILE;
 	xCAT::Utils->runcmd("mv -f /etc/services.new /etc/services", -1);
 
@@ -120,7 +146,9 @@ sub stop_RRD_server
 		}
 	}
 	open FILE, ">/etc/inetd.conf.new" or return -1;
-	print FILE @old;
+        foreach (@old){
+                print FILE "$_\n";
+        }
 	close FILE;
 	xCAT::Utils->runcmd("mv -f /etc/inetd.conf.new /etc/inetd.conf", -2);
 	if(xCAT::Utils->isAIX()){