...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package pidfile
23
24 import (
25 "fmt"
26 "os"
27 "path/filepath"
28 "strconv"
29 "strings"
30
31 "github.com/pkg/errors"
32 )
33
34
35 type PIDFile struct {
36 path string
37 }
38
39 func processExists(pid int) bool {
40 if _, err := os.Stat(filepath.Join("/proc", strconv.Itoa(pid))); err == nil {
41 return true
42 }
43 return false
44 }
45
46 func checkPIDFileAlreadyExists(path string) error {
47 if pidByte, err := os.ReadFile(path); err == nil {
48 pidString := strings.TrimSpace(string(pidByte))
49 if pid, err := strconv.Atoi(pidString); err == nil {
50 if processExists(pid) {
51 return errors.Errorf("pid file found, ensure docker is not running or delete %s", path)
52 }
53 }
54 }
55 return nil
56 }
57
58
59 func New(path string) (*PIDFile, error) {
60 if err := checkPIDFileAlreadyExists(path); err != nil {
61 return nil, err
62 }
63
64 if err := os.MkdirAll(filepath.Dir(path), os.FileMode(0755)); err != nil {
65 return nil, err
66 }
67 if err := os.WriteFile(path, []byte(fmt.Sprintf("%d", os.Getpid())), 0644); err != nil {
68 return nil, err
69 }
70
71 return &PIDFile{path: path}, nil
72 }
73
74
75 func (file PIDFile) Remove() error {
76 return os.Remove(file.path)
77 }
78