1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- // 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"
- "strings"
- "github.com/docker/docker/pkg/system"
- )
- // 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 pidByte, err := ioutil.ReadFile(path); err == nil {
- pidString := strings.TrimSpace(string(pidByte))
- if pid, err := strconv.Atoi(pidString); err == nil {
- if processExists(pid) {
- 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
- }
- // Note MkdirAll returns nil if a directory already exists
- if err := system.MkdirAll(filepath.Dir(path), os.FileMode(0755)); 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 {
- return os.Remove(file.path)
- }
|