рдЧреЛрд▓рдВрдЧ рдбреЗрдореЙрди

рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рдПрдХ рд▓рд╛рдЗрдирдХреНрд╕ рдбреЗрдореЙрди рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдереА рдЬреЛ рдПрдХ рдЫреЛрдЯреА рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрд╡рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИред рдЙрд╕ рд╕рдордп, рдореИрдВрдиреЗ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЧреЛ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рднрд╛рд╖рд╛ рдкрд╕рдВрдж рдЖрдИ, рдЗрд╕рд▓рд┐рдП рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХрд╛ рд╡рдЬрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЗрд╕ рдкрд░ рдХрд╛рд░реНрдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЧреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд┐рд░ рдерд╛ рдФрд░ рдЗрд╕рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг 1.0.1 рдерд╛ред

рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝реЗрдВ рдХрд┐ рдореБрдЭреЗ рдХрд┐рди рдиреБрдХрд╕рд╛рдиреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдкрдврд╝реЗрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рддреБрд░рдВрдд рдЖрд░рдХреНрд╖рдг рдХрд░ рджреВрдВрдЧрд╛: рдореИрдВ рдЧреЛ рдкрд░ рджрд╛рдирд╡ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдХреЗрд╡рд▓ рд╕реВрдХреНрд╖реНрдорддрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЛ рдереЛрдбрд╝рд╛ рдкрддрд╛ рд╣реИ рдХрд┐ рдПрдХ "рдбреЗрдореЙрди" рдХреНрдпрд╛ рд╣реИ рдпрд╛ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ Google рдкрд░ рдпрд╛ рд▓рд┐рдирдХреНрд╕ рдбреЗрдореЙрди рд╣рдм рдореЗрдВ рдпрд╛ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдВрдХ рдХреА рд╕реВрдЪреА рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реБрдП рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд▓реЗрдХрд┐рди рд╡рд╛рдкрд╕ рд░рд╛рдХреНрд╖рд╕реЛрдВ рдХреЗ рд▓рд┐рдПред рдкрд╣рд▓реЗ рддреЛ рдореИрдВрдиреЗ рд╢рд╛рд╕реНрддреНрд░реАрдп рдЕрднрд┐рдирдп рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛:

рдорд╛рдирдХ syscall рдкреИрдХреЗрдЬ рдореЗрдВ рдПрдХ рд╕рд╛рдл рдХрд╛рдВрдЯрд╛ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдиреЗ рдореБрдЭреЗ рдирд╣реАрдВ рд░реЛрдХрд╛ рдФрд░ рдХреЛрдИ рд╕рдВрджреЗрд╣ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдмрд╕ рдХреБрдЫ рдРрд╕рд╛ рдХрд┐рдпрд╛ (рд╕рд░рд▓реАрдХреГрдд):
ret, _, err := syscall.Syscall(syscall.SYS_FORK, 0, 0, 0) if err != 0 { os.Exit(2) } if ret > 0 { //   os.Exit(0) } 

рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдбреЗрдореЙрди рдХреЛ рдЪрд▓рд╛рдиреЗ рдФрд░ ps -eafw рдФрд░ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдХреА 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/In187668/


All Articles