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.orgSource: https://habr.com/ru/post/187668/
All Articles