ret, _, err := syscall.Syscall(syscall.SYS_FORK, 0, 0, 0) if err != 0 { os.Exit(2) } if ret > 0 { // os.Exit(0) }
ps -eafw
and lsof -p , , .
, Go os/signal. , . fork, . . , code.google.com/p/go/issues/detail?id=227, . : Go fork, .. , , (goroutines), , , .
. , fork . os/signal, , :
func init() { signal_enable(0) // first call - initialize go loop() }
, , loop() . main(). loop() . , fork, loop(). , fork. init() fork, .
os/signal , init() Init() fork. .
- , : - - . , - , . , StartProcess . , , fork exec . , , , - . , . , _GO_DAEMON=1
.
:
const ( envVarName = "_GO_DAEMON" envVarValue = "1" ) func Reborn(umask uint32, workDir string) (err error) { if !WasReborn() { var path string if path, err = filepath.Abs(os.Args[0]); err != nil { return } cmd := exec.Command(path, os.Args[1:]...) envVar := fmt.Sprintf("%s=%s", envVarName, envVarValue) cmd.Env = append(os.Environ(), envVar) if err = cmd.Start(); err != nil { return } os.Exit(0) } syscall.Umask(int(umask)) if len(workDir) == 0 { if err = os.Chdir(workDir); err != nil { return } } _, err = syscall.Setsid() return } func WasReborn() bool { return os.Getenv(envVarName) == envVarValue }
. os/exec - StartProcess .
, , , , Reborn(), . - WasReborn(). (, ), Reborn(), Reborn() ( panic()), - /dev/null.
, , github: go-daemon . pid- . Go. - .
:
- Wikipedia
linux
golang.org
lsof -p , , .
, Go os/signal. , . fork, . . , code.google.com/p/go/issues/detail?id=227, . : Go fork, .. , , (goroutines), , , .
. , fork . os/signal, , :
func init() { signal_enable(0) // first call - initialize go loop() }
, , loop() . main(). loop() . , fork, loop(). , fork. init() fork, .
os/signal , init() Init() fork. .
- , : - - . , - , . , StartProcess . , , fork exec . , , , - . , . , _GO_DAEMON=1
.
:
const ( envVarName = "_GO_DAEMON" envVarValue = "1" ) func Reborn(umask uint32, workDir string) (err error) { if !WasReborn() { var path string if path, err = filepath.Abs(os.Args[0]); err != nil { return } cmd := exec.Command(path, os.Args[1:]...) envVar := fmt.Sprintf("%s=%s", envVarName, envVarValue) cmd.Env = append(os.Environ(), envVar) if err = cmd.Start(); err != nil { return } os.Exit(0) } syscall.Umask(int(umask)) if len(workDir) == 0 { if err = os.Chdir(workDir); err != nil { return } } _, err = syscall.Setsid() return } func WasReborn() bool { return os.Getenv(envVarName) == envVarValue }
. os/exec - StartProcess .
, , , , Reborn(), . - WasReborn(). (, ), Reborn(), Reborn() ( panic()), - /dev/null.
, , github: go-daemon . pid- . Go. - .
:
- Wikipedia
linux
golang.org
lsof -p , , .
, Go os/signal. , . fork, . . , code.google.com/p/go/issues/detail?id=227, . : Go fork, .. , , (goroutines), , , .
. , fork . os/signal, , :
func init() { signal_enable(0) // first call - initialize go loop() }
, , loop() . main(). loop() . , fork, loop(). , fork. init() fork, .
os/signal , init() Init() fork. .
- , : - - . , - , . , StartProcess . , , fork exec . , , , - . , . , _GO_DAEMON=1
.
:
const ( envVarName = "_GO_DAEMON" envVarValue = "1" ) func Reborn(umask uint32, workDir string) (err error) { if !WasReborn() { var path string if path, err = filepath.Abs(os.Args[0]); err != nil { return } cmd := exec.Command(path, os.Args[1:]...) envVar := fmt.Sprintf("%s=%s", envVarName, envVarValue) cmd.Env = append(os.Environ(), envVar) if err = cmd.Start(); err != nil { return } os.Exit(0) } syscall.Umask(int(umask)) if len(workDir) == 0 { if err = os.Chdir(workDir); err != nil { return } } _, err = syscall.Setsid() return } func WasReborn() bool { return os.Getenv(envVarName) == envVarValue }
. os/exec - StartProcess .
, , , , Reborn(), . - WasReborn(). (, ), Reborn(), Reborn() ( panic()), - /dev/null.
, , github: go-daemon . pid- . Go. - .
:
- Wikipedia
linux
golang.org
lsof -p , , .
, Go os/signal. , . fork, . . , code.google.com/p/go/issues/detail?id=227, . : Go fork, .. , , (goroutines), , , .
. , fork . os/signal, , :
func init() { signal_enable(0) // first call - initialize go loop() }
, , loop() . main(). loop() . , fork, loop(). , fork. init() fork, .
os/signal , init() Init() fork. .
- , : - - . , - , . , StartProcess . , , fork exec . , , , - . , . , _GO_DAEMON=1
.
:
const ( envVarName = "_GO_DAEMON" envVarValue = "1" ) func Reborn(umask uint32, workDir string) (err error) { if !WasReborn() { var path string if path, err = filepath.Abs(os.Args[0]); err != nil { return } cmd := exec.Command(path, os.Args[1:]...) envVar := fmt.Sprintf("%s=%s", envVarName, envVarValue) cmd.Env = append(os.Environ(), envVar) if err = cmd.Start(); err != nil { return } os.Exit(0) } syscall.Umask(int(umask)) if len(workDir) == 0 { if err = os.Chdir(workDir); err != nil { return } } _, err = syscall.Setsid() return } func WasReborn() bool { return os.Getenv(envVarName) == envVarValue }
. os/exec - StartProcess .
, , , , Reborn(), . - WasReborn(). (, ), Reborn(), Reborn() ( panic()), - /dev/null.
, , github: go-daemon . pid- . Go. - .
:
- Wikipedia
linux
golang.org
lsof -p , , .
, Go os/signal. , . fork, . . , code.google.com/p/go/issues/detail?id=227, . : Go fork, .. , , (goroutines), , , .
. , fork . os/signal, , :
func init() { signal_enable(0) // first call - initialize go loop() }
, , loop() . main(). loop() . , fork, loop(). , fork. init() fork, .
os/signal , init() Init() fork. .
- , : - - . , - , . , StartProcess . , , fork exec . , , , - . , . , _GO_DAEMON=1
.
:
const ( envVarName = "_GO_DAEMON" envVarValue = "1" ) func Reborn(umask uint32, workDir string) (err error) { if !WasReborn() { var path string if path, err = filepath.Abs(os.Args[0]); err != nil { return } cmd := exec.Command(path, os.Args[1:]...) envVar := fmt.Sprintf("%s=%s", envVarName, envVarValue) cmd.Env = append(os.Environ(), envVar) if err = cmd.Start(); err != nil { return } os.Exit(0) } syscall.Umask(int(umask)) if len(workDir) == 0 { if err = os.Chdir(workDir); err != nil { return } } _, err = syscall.Setsid() return } func WasReborn() bool { return os.Getenv(envVarName) == envVarValue }
. os/exec - StartProcess .
, , , , Reborn(), . - WasReborn(). (, ), Reborn(), Reborn() ( panic()), - /dev/null.
, , github: go-daemon . pid- . Go. - .
:
- Wikipedia
linux
golang.org
Source: https://habr.com/ru/post/187668/
All Articles