diff --git a/server/conn.go b/server/conn.go
index <HASH>..<HASH> 100644
--- a/server/conn.go
+++ b/server/conn.go
@@ -346,11 +346,14 @@ func (cc *clientConn) Run() {
 	for !cc.killed {
 		cc.alloc.Reset()
 		data, err := cc.readPacket()
-		if err != nil {
+		if err != nil || cc.killed {
 			if terror.ErrorNotEqual(err, io.EOF) {
 				log.Errorf("[%d] read packet error, close this connection %s",
 					cc.connectionID, errors.ErrorStack(err))
 			}
+			if cc.killed {
+				log.Warnf("[%d] session is killed.", cc.connectionID)
+			}
 			return
 		}
 
diff --git a/server/server.go b/server/server.go
index <HASH>..<HASH> 100644
--- a/server/server.go
+++ b/server/server.go
@@ -234,6 +234,9 @@ func (s *Server) ShowProcessList() []util.ProcessInfo {
 	var rs []util.ProcessInfo
 	s.rwlock.RLock()
 	for _, client := range s.clients {
+		if client.killed {
+			continue
+		}
 		rs = append(rs, client.ctx.ShowProcess())
 	}
 	s.rwlock.RUnlock()
server: make show processlist doesn't include killed session (#<I>)