//go:build !windows package main import ( "fmt" "os" "os/signal" "syscall" ) func (app *appContext) HardRestart() error { defer func() { quit := make(chan os.Signal, 0) if r := recover(); r != nil { signal.Notify(quit, os.Interrupt, syscall.SIGTERM) <-quit } }() args := os.Args // After a single restart, args[0] gets messed up and isnt the real executable. // JFA_DEEP tells the new process its a child, and JFA_EXEC is the real executable if os.Getenv("JFA_DEEP") == "" { os.Setenv("JFA_DEEP", "1") os.Setenv("JFA_EXEC", args[0]) } env := os.Environ() err := syscall.Exec(os.Getenv("JFA_EXEC"), []string{""}, env) if err != nil { return err } panic(fmt.Errorf("r")) }