diff --git a/pkg/sideload/publish.go b/pkg/sideload/publish.go index 71a3ea0..0341ed7 100644 --- a/pkg/sideload/publish.go +++ b/pkg/sideload/publish.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "git.solsynth.dev/goatworks/roadsign/pkg/warden" + "github.com/rs/zerolog/log" "os" "os/exec" "path/filepath" @@ -45,7 +46,9 @@ func doPublish(c *fiber.Ctx) error { var instance *warden.AppInstance if application != nil { if instance = warden.GetFromPool(application.ID); instance != nil { - _ = instance.Stop() + if err := instance.Stop(); err != nil { + log.Warn().Err(err).Str("id", application.ID).Msg("Failed to stop application when publishing...") + } } } else if destination != nil && destination.GetType() != navi.DestinationStaticFile { return fiber.ErrUnprocessableEntity diff --git a/pkg/warden/executor.go b/pkg/warden/executor.go index cdd64f2..b1622ff 100644 --- a/pkg/warden/executor.go +++ b/pkg/warden/executor.go @@ -104,15 +104,18 @@ func (v *AppInstance) Stop() error { log.Warn().Int("pid", v.Cmd.Process.Pid).Err(err).Msgf("Failed to send SIGTERM to process...") if err = v.Cmd.Process.Kill(); err != nil { log.Error().Int("pid", v.Cmd.Process.Pid).Err(err).Msgf("Failed to kill process...") - } else { - v.Cmd = nil + return err } - return err - } else { - v.Cmd = nil } } + // We need to wait for the process to exit + // The wait syscall will read the exit status of the process + // So that we don't produce defunct processes + // Refer to https://stackoverflow.com/questions/46293435/golang-exec-command-cause-a-lot-of-defunct-processes + _ = v.Cmd.Wait() + + v.Cmd = nil v.Status = AppExited return nil }