package errorHandle import ( "fmt" "os/exec" "time" "Watchdog_Linux-systemd/postLog" "Watchdog_Linux-systemd/global" ) type ServiceStatusChecker func(serviceName string) bool func HandleErrorProcess(serviceName string, isServiceRunning ServiceStatusChecker) error { postLog.Debug(fmt.Sprintf("[HandleErrorProcess] Start handle error process for service: %s", serviceName)) serviceControl := &ServiceControl{ ServiceName: serviceName, RetryCount: 0, } for i := 0; i < 5; i++ { if global.Monitors[serviceName].Recovery { // Only recovery process is started serviceControl.RetryCount++ postLog.Debug(fmt.Sprintf("[HandleErrorProcess] Try to restart service '%s', retry count: %d", serviceName, serviceControl.RetryCount)) cmd := exec.Command("systemctl", "restart", serviceName) err := cmd.Run() if err == nil { if isServiceRunning != nil && isServiceRunning(serviceName) { return nil } } time.Sleep(time.Duration(i+1) * time.Second) } } serviceControl.ErrorType = "restart" serviceControl.ErrorMsg = fmt.Sprintf("Failed to recover service '%s', retry count: %d", serviceName, serviceControl.RetryCount) serviceControl.ErrorTime = time.Now() return fmt.Errorf(serviceControl.ErrorMsg) }