//go:build !windows package single_instance import ( "os" "strconv" "syscall" ) // CreateLockFile tries to create a file with given name and acquire an // exclusive lock on it. If the file already exists AND is still locked, it will // fail. func CreateLockFile(filename string, PID int) (*os.File, error) { file, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE, 0600) if err != nil { return nil, err } err = syscall.Flock(int(file.Fd()), syscall.LOCK_EX|syscall.LOCK_NB) if err != nil { file.Close() return nil, err } // Write PID to lock file contents := strconv.Itoa(PID) if err := file.Truncate(0); err != nil { file.Close() return nil, err } if _, err := file.WriteString(contents); err != nil { file.Close() return nil, err } return file, nil }