| package reexec // import "github.com/docker/docker/pkg/reexec" | |
| import ( | |
| "os/exec" | |
| "syscall" | |
| "golang.org/x/sys/unix" | |
| ) | |
| // Self returns the path to the current process's binary. | |
| // Returns "/proc/self/exe". | |
| func Self() string { | |
| return "/proc/self/exe" | |
| } | |
| // Command returns *exec.Cmd which has Path as current binary. Also it setting | |
| // SysProcAttr.Pdeathsig to SIGTERM. | |
| // This will use the in-memory version (/proc/self/exe) of the current binary, | |
| // it is thus safe to delete or replace the on-disk binary (os.Args[0]). | |
| // | |
| // As SysProcAttr.Pdeathsig is set, the signal will be sent to the process when | |
| // the OS thread which created the process dies. It is the caller's | |
| // responsibility to ensure that the creating thread is not terminated | |
| // prematurely. See https://go.dev/issue/27505 for more details. | |
| func Command(args ...string) *exec.Cmd { | |
| return &exec.Cmd{ | |
| Path: Self(), | |
| Args: args, | |
| SysProcAttr: &syscall.SysProcAttr{ | |
| Pdeathsig: unix.SIGTERM, | |
| }, | |
| } | |
| } |