pid.go (780B)
1 package pid 2 3 import ( 4 "errors" 5 "os" 6 "strconv" 7 "syscall" 8 ) 9 10 func Read(filename string) (pid int, err error) { 11 data, err := os.ReadFile(filename) 12 if err != nil { 13 return 0, err 14 } 15 16 pid, err = strconv.Atoi(string(data)) 17 if err != nil { 18 return 0, err 19 } 20 21 if pid <= 0 { 22 return 0, errors.New("invalid pid") 23 } 24 25 // Check if the process is running. 26 // See man kill(2) for more information. 27 if err != nil && !errors.Is(err, syscall.EPERM) { 28 return 0, nil 29 } 30 31 return pid, nil 32 } 33 34 func Write(filename string) error { 35 pid, err := Read(filename) 36 if err != nil && !errors.Is(err, os.ErrNotExist) { 37 return err 38 } 39 if pid > 0 { 40 return errors.New("already running") 41 } 42 43 pid = os.Getpid() 44 data := []byte(strconv.Itoa(pid)) 45 46 return os.WriteFile(filename, data, 0o0644) 47 }