// StopSnapServices stops service units for the applications from the snap which are services. func StopSnapServices(s *snap.Info, inter interacter) error { sysd := systemd.New(dirs.GlobalRootDir, inter) nservices := 0 for _, app := range s.Apps { if app.Daemon == "" { continue } nservices++ serviceName := filepath.Base(app.ServiceFile()) tout := serviceStopTimeout(app) if err := sysd.Stop(serviceName, tout); err != nil { if !systemd.IsTimeout(err) { return err } inter.Notify(fmt.Sprintf("%s refused to stop, killing.", serviceName)) // ignore errors for kill; nothing we'd do differently at this point sysd.Kill(serviceName, "TERM") time.Sleep(killWait) sysd.Kill(serviceName, "KILL") } } return nil }
// StopSnapServices stops service units for the applications from the snap which are services. func StopSnapServices(s *snap.Info, inter interacter) error { sysd := systemd.New(dirs.GlobalRootDir, inter) for _, app := range s.Apps { // Handle the case where service file doesn't exist and don't try to stop it as it will fail. // This can happen with snap try when snap.yaml is modified on the fly and a daemon line is added. if app.Daemon == "" || !osutil.FileExists(app.ServiceFile()) { continue } serviceName := filepath.Base(app.ServiceFile()) tout := serviceStopTimeout(app) if err := sysd.Stop(serviceName, tout); err != nil { if !systemd.IsTimeout(err) { return err } inter.Notify(fmt.Sprintf("%s refused to stop, killing.", serviceName)) // ignore errors for kill; nothing we'd do differently at this point sysd.Kill(serviceName, "TERM") time.Sleep(killWait) sysd.Kill(serviceName, "KILL") } } return nil }