-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathload.go
More file actions
76 lines (68 loc) · 1.53 KB
/
load.go
File metadata and controls
76 lines (68 loc) · 1.53 KB
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
package reload
import (
"flag"
"net"
"os"
"syscall"
)
var (
reLoad uint
)
func init() {
flag.UintVar(&reLoad, "reLoad", 0, "重启次数")
}
// Service 服务
type Service interface {
SetCanReLoad(count uint) // 设置可重启次数
CanReLoad() bool // 是否可以重启
IsChild() bool // 是否子进程
Start() // 开启监控 注意:必须以这个来堵塞
Reload() (err error)
Shutdown()
Wait()
Add(delat int)
Done()
Logger() Logger
}
// NewService 初始化
func NewService(l net.Listener) Service {
return NewServiceWith(l, WithDefaultHandle())
}
// NewService 初始化
func NewServiceWith(l net.Listener, opts ...Option) Service {
if !flag.Parsed() {
panic(" You Must Run Flag.Parse() at Main Pack ! ")
}
optsTmp := evaluateOptions(opts)
var s = new(s)
s.L = l
s.reLoad = reLoad
s.SigHandle = optsTmp.sigHandle
s.sigs = make([]os.Signal, 0, len(optsTmp.sigHandle))
for sig := range optsTmp.sigHandle {
s.sigs = append(s.sigs, sig)
}
s.logger = optsTmp.logger
s.sigChan = make(chan os.Signal)
s.stopChan = make(chan struct{})
return s
}
// GetListener 取得连接
func GetListener(laddr string) (l net.Listener, err error) {
if reLoad > 0 {
// 子进程用文字描述符来接收数据
f := os.NewFile(3, "")
l, err = net.FileListener(f)
if err != nil {
return
}
// 如果是子进程就杀掉父进程
syscall.Kill(syscall.Getppid(), syscall.SIGTSTP) //干掉父进程
} else {
l, err = net.Listen("tcp", laddr)
if err != nil {
return
}
}
return
}