cloudflare/cloudflared · error
error creating %s: %v
Error message
error creating %s: %v
What it means
This error is returned by ServiceTemplate.Generate when os.MkdirAll fails to create the parent directory of the resolved service file path (e.g. /Library/LaunchDaemons on macOS). MkdirAll fails when a path component exists as a non-directory, or permission is denied. The message names the plist folder it tried to create.
Source
Thrown at cmd/cloudflared/service_template.go:61
}
if _, err = os.Stat(resolvedPath); err == nil {
return errors.New(serviceAlreadyExistsWarn(resolvedPath))
}
var buffer bytes.Buffer
err = tmpl.Execute(&buffer, args)
if err != nil {
return fmt.Errorf("error generating %s: %v", st.Path, err)
}
fileMode := os.FileMode(0o644)
if st.FileMode != 0 {
fileMode = st.FileMode
}
plistFolder := filepath.Dir(resolvedPath)
err = os.MkdirAll(plistFolder, 0o755)
if err != nil {
return fmt.Errorf("error creating %s: %v", plistFolder, err)
}
err = os.WriteFile(resolvedPath, buffer.Bytes(), fileMode)
if err != nil {
return fmt.Errorf("error writing %s: %v", resolvedPath, err)
}
return nil
}
func (st *ServiceTemplate) Remove() error {
resolvedPath, err := st.ResolvePath()
if err != nil {
return err
}
err = os.Remove(resolvedPath)
if err != nil {
return fmt.Errorf("error deleting %s: %v", resolvedPath, err)
}View on GitHub (pinned to 2253eeeb25)
Solutions
- Run the install command with elevated privileges (sudo cloudflared service install)
- Check that no file exists at any component of the plist folder path: ls -la /Library/LaunchDaemons
- Verify filesystem permissions/ACLs on the parent directory
- Install to a user-writable location if root is unavailable
Example fix
// before $ cloudflared service install // permission denied // after $ sudo cloudflared service install
Defensive patterns
Strategy: try-catch
Validate before calling
plistFolder := filepath.Dir(resolvedPath)
if fi, err := os.Stat(plistFolder); err == nil && !fi.IsDir() {
return fmt.Errorf("%s exists but is not a directory", plistFolder)
}
if _, err := os.Stat(plistFolder); err != nil {
// will need to create: verify parent is writable
if err := unix.Access(filepath.Dir(plistFolder), unix.W_OK); err != nil {
return errors.New("need elevated privileges (sudo) to create service directory")
}
} Type guard
func dirWritable(path string) bool {
f, err := os.CreateTemp(path, ".probe")
if err != nil { return false }
oname := f.Name()
_ = f.Close()
_ = os.Remove(oname)
return true
} Try / catch
if err := st.Generate(args); err != nil {
if strings.Contains(err.Error(), "error creating") && strings.Contains(err.Error(), "permission denied") {
// advise: re-run install with sudo
}
return err
} Prevention
- Run service installation with sudo/root on macOS
- Check that no regular file occupies a parent path component before install
- Verify writable /Library/LaunchDaemons under MDM restrictions before automated deploys
When it happens
Trigger: Calling Generate() (via installLaunchd) where filepath.Dir(resolvedPath) cannot be created: permission denied writing to /Library/LaunchDaemons without root, or a file already exists at a parent path component.
Common situations: Running 'cloudflared service install' without sudo on macOS; corporate-managed machines restricting /Library/LaunchDaemons; an unexpected file named like the target directory blocking MkdirAll.
Understand the failure class
Background: mkdir permission denied (EACCES): failed to create directory errors explained — this error's family across 32 libraries.
Related errors
- error writing %s: %v
- error deleting %s: %v
- error determining executable path: %w
- error generating %s template: %v
- error generating %s: %v
AI-assisted analysis of cloudflare/cloudflared@2253eeeb25 (2026-09-06).
Data as JSON: /api/errors/da35bdb579dd9b70.
Report an issue: GitHub.