39 lines
1.2 KiB
Go
39 lines
1.2 KiB
Go
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)
|
|
} |