Files
triggerssmith/cmd/stop.go

59 lines
1.6 KiB
Go

package cmd
import (
"log/slog"
"os"
"syscall"
"git.oblat.lv/alex/triggerssmith/internal/vars"
"github.com/spf13/cobra"
)
var optsStopCmd = struct {
Debug *bool
PID *int
Force *bool
}{}
var stopCmd = &cobra.Command{
Use: "stop",
Short: "Stop active server by PID using SIGTERM",
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)
}
*optsStopCmd.PID = pid
proc, err := os.FindProcess(*optsStopCmd.PID)
if err != nil {
slog.Error("failed to find process", slog.Int("pid", *optsStopCmd.PID), slog.String("err", err.Error()))
}
if *optsStopCmd.Force {
slog.Debug("force stopping server by SIGKILL", slog.Int("pid", *optsStopCmd.PID))
proc.Signal(syscall.SIGKILL)
} else {
slog.Debug("stopping server", slog.Int("pid", *optsStopCmd.PID))
proc.Signal(syscall.SIGTERM)
}
slog.Debug("done")
},
}
func init() {
optsStopCmd.Debug = stopCmd.Flags().BoolP("debug", "d", false, "Enable debug logs")
optsStopCmd.PID = stopCmd.Flags().IntP("pid", "p", -1, "Define server PID")
optsStopCmd.Force = stopCmd.Flags().BoolP("force", "f", false, "Force stop using SIGKILL")
rootCmd.AddCommand(stopCmd)
}