-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathrestart_linux.go
80 lines (68 loc) · 1.6 KB
/
restart_linux.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(
"bytes"
"os/exec"
"sync"
"fmt"
"go/build"
"strings"
"os"
"log"
)
func restart(root string) (out []byte, err error){
stopRun()
context := build.Default
splits := strings.Split(root, "/")
bin := context.GOPATH + "/bin/" + splits[len(splits) - 1]
os.Remove(bin)
out, err = run(context.GOPATH + "/bin/", "go", "build", "-o", bin, splits[len(splits) - 1])
if err != nil {
return out, err
}
if *withrun {
go run("", bin)
}
return nil, nil
}
func stopRun() {
running.Lock()
if running.cmd != nil {
log.Println("kill cmd:", running.cmd.Args)
running.cmd.Process.Kill()
running.cmd = nil
}
running.Unlock()
}
var running struct {
sync.Mutex
cmd *exec.Cmd
}
func run(dir string, args ...string) ([]byte, error) {
var buf bytes.Buffer
cmd := exec.Command(args[0], args[1:]...)
log.Println("run cmd:", cmd.Args)
cmd.Dir = dir
cmd.Stdout = &buf
cmd.Stderr = cmd.Stdout
// Start command and leave in 'running'.
running.Lock()
if running.cmd != nil {
log.Println("running cmd:", running.cmd.Args)
defer running.Unlock()
return nil, fmt.Errorf("already running %s", running.cmd.Path)
}
if err := cmd.Start(); err != nil {
running.Unlock()
return nil, err
}
running.cmd = cmd
running.Unlock()
// Wait for the command. Clean up,
err := cmd.Wait()
running.Lock()
if running.cmd == cmd {
running.cmd = nil
}
running.Unlock()
return buf.Bytes(), err
}