1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//go:build unix
package devinstance
import (
"os"
"syscall"
)
func SpawnDetached(argv []string, logPath string) (int, error) {
null, err := os.Open(os.DevNull)
if err != nil {
return 0, err
}
defer null.Close()
log, err := os.OpenFile(logPath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0o600)
if err != nil {
return 0, err
}
defer log.Close()
p, err := os.StartProcess(argv[0], argv, &os.ProcAttr{Files: []*os.File{null, log, log},
Sys: &syscall.SysProcAttr{Setsid: true}})
if err != nil {
return 0, err
}
pid := p.Pid
p.Release()
return pid, nil
}