diff --git a/cmd/watchdog/main.go b/cmd/watchdog/main.go
index 312b22f..58208c4 100755
--- a/cmd/watchdog/main.go
+++ b/cmd/watchdog/main.go
@@ -67,17 +67,22 @@ func doWatch(watches []*watchdog) {
 
 		fmt.Println("in ping tick")
 
+		needReconnect := false
 		for _, w := range watches {
-			doWatch0(w)
+			needReconnect = doWatch0(w) || needReconnect
+		}
+
+		if needReconnect {
+			return
 		}
 	}
 }
 
-func doWatch0(w *watchdog) bool {
+func doWatch0(w *watchdog) (needReconnect bool) {
 	pinger, err := ping.NewPinger(w.addr)
 	if err != nil {
 		_, _ = fmt.Fprintf(os.Stderr, "ping to target failed: %s\n", err)
-		return false
+		return
 	}
 
 	pinger.Timeout = time.Second * 15
@@ -87,21 +92,21 @@ func doWatch0(w *watchdog) bool {
 	err = pinger.Run()
 	if err != nil {
 		_, _ = fmt.Fprintf(os.Stderr, "ping to target failed: %s\n", err)
-		return false
+		return
 	}
 	fmt.Printf("finished ping to %s\n", w.addr)
 
 	statistics := pinger.Statistics()
 	if statistics.PacketsRecv != 0 {
 		w.life = 3
-		return false
+		return
 	}
 
 	w.life--
 	fmt.Printf("ping vm %s(%s) failed, left %d life", w.addr, w.vm.Name(), w.life)
 
 	if w.life > 0 {
-		return false
+		return
 	}
 
 	fmt.Printf("restarting vm %s(%s)", w.addr, w.vm.Name())
@@ -111,7 +116,7 @@ func doWatch0(w *watchdog) bool {
 		return true
 	}
 
-	return false
+	return
 }
 
 func reset(vm *vmomi.VirtualMachine) error {