| 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, |
| }, |
| } |
| } |