go守护进程实现方式

go 实现守护进程的实现代码。

代码块

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package main

import (
"fmt"
"log"
"os"
"runtime"
"syscall"
"time"
)

func daemon(nochdir, noclose int) int {
var ret, ret2 uintptr
var err syscall.Errno

darwin := runtime.GOOS == "darwin"

// already a daemon
if syscall.Getppid() == 1 {
return 0
}

// fork off the parent process
ret, ret2, err = syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
if err != 0 {
return -1
}

// failure
if ret2 < 0 {
os.Exit(-1)
}

// handle exception for darwin
if darwin && ret2 == 1 {
ret = 0
}

// if we got a good PID, then we call exit the parent process.
if ret > 0 {
os.Exit(0)
}

/* Change the file mode mask */
_ = syscall.Umask(0)

// create a new SID for the child process
s_ret, s_errno := syscall.Setsid()
if s_errno != nil {
log.Printf("Error: syscall.Setsid errno: %d", s_errno)
}
if s_ret < 0 {
return -1
}

if nochdir == 0 {
os.Chdir("/")
}

if noclose == 0 {
f, e := os.OpenFile("/dev/null", os.O_RDWR, 0)
if e == nil {
fd := f.Fd()
syscall.Dup2(int(fd), int(os.Stdin.Fd()))
syscall.Dup2(int(fd), int(os.Stdout.Fd()))
syscall.Dup2(int(fd), int(os.Stderr.Fd()))
}
}

return 0
}

func main() {
daemon(0, 1)
for {
fmt.Println("hello")
time.Sleep(1 * time.Second)
}

}
文章目录
  1. 1. 代码块