-
Notifications
You must be signed in to change notification settings - Fork 2
/
daemon.go
89 lines (79 loc) · 1.65 KB
/
daemon.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
81
82
83
84
85
86
87
88
89
package timeoutTicker
import (
"flag"
"fmt"
"github.com/spf13/viper"
"io/ioutil"
"os"
"os/exec"
"strconv"
"strings"
"syscall"
"time"
)
var godaemon = flag.Bool("d", false, "run app as a daemon with -d=true")
var opt = flag.String("opt", "start", "-opt=start/stop/restart")
func init() {
if !flag.Parsed() {
flag.Parse()
}
if err := InitConf(""); err != nil {
fmt.Println(err)
os.Exit( 0 )
}
args := os.Args[1:]
if *godaemon {
i := 0
for ; i < len(args); i++ {
if args[i] == "-d=true" {
args[i] = "-d=false"
break
}
}
if *opt == "start"{
cmd := exec.Command(os.Args[0], args...)
cmd.Start()
fmt.Println("[PID]", cmd.Process.Pid)
os.Exit(0)
}
}
if *opt != "start"{
//读取pid
pidFile := viper.GetString("pid")
pf, err := os.OpenFile(pidFile, os.O_RDWR, 0)
defer pf.Close()
if os.IsNotExist(err){
fmt.Println(pidFile, "文件不存在")
os.Exit( 0 )
} else if err != nil{
fmt.Println(err)
os.Exit(0)
}
pd, _ := ioutil.ReadAll( pf )
old_pid, err := strconv.Atoi( strings.Replace(string(pd),"\n","", -1) )
if err != nil{
fmt.Println( err )
os.Exit( 0 )
}
if *opt == "stop"{
err := syscall.Kill(old_pid, syscall.SIGQUIT)
if err == nil{
fmt.Println("stop success")
}
os.Exit( 0 )
}else if *opt == "restart"{
err := syscall.Kill(old_pid, syscall.SIGQUIT)
if err == nil{
fmt.Println("stop success")
}
fmt.Println("starting...")
after := time.After(time.Second*5)
<-after
cmd := exec.Command(os.Args[0], "-opt=start", "-d=false")
cmd.Start()
fmt.Println("[PID]", cmd.Process.Pid)
fmt.Println("start success")
os.Exit(0)
}
}
}