package cmd import ( "io/ioutil" "log/slog" "os" "strconv" "strings" "syscall" "git.oblat.lv/alex/triggerssmith/internal/vars" "github.com/spf13/cobra" ) var optsReloadCmd = struct { Debug *bool PID *int }{} func readPID(path string) (int, error) { data, err := ioutil.ReadFile(path) if err != nil { return 0, err } s := strings.TrimSpace(string(data)) pid, err := strconv.Atoi(s) if err != nil { return 0, err } return pid, nil } var reloadCmd = &cobra.Command{ Use: "reload", Short: "Reload active server by PID using SIGHUP", Run: func(cmd *cobra.Command, args []string) { defer func() { if r := recover(); r != nil { slog.Error("Application panicked", slog.Any("error", r)) } }() // configure logger if *optsReloadCmd.Debug { slog.SetDefault(slog.New(slog.NewTextHandler(cmd.OutOrStdout(), &slog.HandlerOptions{Level: slog.LevelDebug, AddSource: true}))) } else { slog.SetDefault(slog.New(slog.NewTextHandler(cmd.OutOrStdout(), &slog.HandlerOptions{Level: slog.LevelInfo}))) } pid, err := readPID(vars.PID_PATH) if err != nil { panic(err) } *optsReloadCmd.PID = pid slog.Debug("restarting server", slog.Int("pid", *optsReloadCmd.PID)) proc, err := os.FindProcess(*optsReloadCmd.PID) if err != nil { slog.Error("failed to find process", slog.Int("pid", *optsReloadCmd.PID), slog.String("err", err.Error())) } proc.Signal(syscall.SIGHUP) slog.Debug("done") }, } func init() { optsReloadCmd.Debug = reloadCmd.Flags().BoolP("debug", "d", false, "Enable debug logs") optsReloadCmd.PID = reloadCmd.Flags().IntP("pid", "p", -1, "Define server PID") rootCmd.AddCommand(reloadCmd) }