// Package pidfile provides structure and helper functions to create and remove // PID file. A PID file is usually a file used to store the process ID of a // running process. package pidfile import ( "fmt" "io/ioutil" "os" "path/filepath" "strconv" ) // PIDFile is a file used to store the process ID of a running process. type PIDFile struct { path string } func checkPIDFileAlreadyExists(path string) error { if pidString, err := ioutil.ReadFile(path); err == nil { if pid, err := strconv.Atoi(string(pidString)); err == nil { if _, err := os.Stat(filepath.Join("/proc", string(pid))); err == nil { return fmt.Errorf("pid file found, ensure docker is not running or delete %s", path) } } } return nil } // New creates a PIDfile using the specified path. func New(path string) (*PIDFile, error) { if err := checkPIDFileAlreadyExists(path); err != nil { return nil, err } if err := ioutil.WriteFile(path, []byte(fmt.Sprintf("%d", os.Getpid())), 0644); err != nil { return nil, err } return &PIDFile{path: path}, nil } // Remove removes the PIDFile. func (file PIDFile) Remove() error { if err := os.Remove(file.path); err != nil { return err } return nil }