{"record":{"id":"7e297929a4e1a7c6","repo":"cloudflare/cloudflared","slug":"error-writing-s-v","errorCode":null,"errorMessage":"error writing %s: %v","messagePattern":"error writing (.+?): (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/cloudflared/service_template.go","lineNumber":66,"sourceCode":"\tvar buffer bytes.Buffer\n\terr = tmpl.Execute(&buffer, args)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error generating %s: %v\", st.Path, err)\n\t}\n\tfileMode := os.FileMode(0o644)\n\tif st.FileMode != 0 {\n\t\tfileMode = st.FileMode\n\t}\n\n\tplistFolder := filepath.Dir(resolvedPath)\n\terr = os.MkdirAll(plistFolder, 0o755)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error creating %s: %v\", plistFolder, err)\n\t}\n\n\terr = os.WriteFile(resolvedPath, buffer.Bytes(), fileMode)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error writing %s: %v\", resolvedPath, err)\n\t}\n\treturn nil\n}\n\nfunc (st *ServiceTemplate) Remove() error {\n\tresolvedPath, err := st.ResolvePath()\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = os.Remove(resolvedPath)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error deleting %s: %v\", resolvedPath, err)\n\t}\n\treturn nil\n}\n\nfunc serviceAlreadyExistsWarn(service string) string {\n\treturn fmt.Sprintf(\"cloudflared service is already installed at %s; if you are running a cloudflared tunnel, you \"+","sourceCodeStart":48,"sourceCodeEnd":84,"githubUrl":"https://github.com/cloudflare/cloudflared/blob/2253eeeb25a44a713a4b60b8ba1e1b3f377d1a0f/cmd/cloudflared/service_template.go#L48-L84","documentation":"This error is returned by ServiceTemplate.Generate when os.WriteFile fails to write the rendered template buffer to the resolved path (e.g. the launchd plist file). The directory was created successfully, but the final file write failed — typically due to permissions, disk-full, or the destination being a directory. The message includes the resolved file path.","triggerScenarios":"Calling Generate() (via installLaunchd) where os.WriteFile(resolvedPath, buffer.Bytes(), fileMode) returns an error: EACCES on a read-only or root-owned directory, ENOSPC disk full, or resolvedPath exists as a directory.","commonSituations":"Installing the service without sudo so /Library/LaunchDaemons is not writable; an existing stale plist with immutable attribute or wrong ownership; disk exhaustion on the system volume; antivirus/MDM blocking writes to LaunchDaemons.","solutions":["Re-run the install with sudo so the plist is writable","Check the destination path is not an existing directory or immutable file and remove/fix it if stale: ls -laO /Library/LaunchDaemons/com.cloudflare.cloudflared.plist","Verify free disk space (df -h) and writable system volume","Check MDM/endpoint-security software isn't blocking writes to LaunchDaemons"],"exampleFix":"// before\n$ cloudflared service install  // open /Library/LaunchDaemons/...: permission denied\n// after\n$ sudo cloudflared service install","handlingStrategy":"try-catch","validationCode":"if fi, err := os.Stat(resolvedPath); err == nil && fi.IsDir() {\n\treturn fmt.Errorf(\"%s exists as a directory; remove it before installing\", resolvedPath)\n}\nif err := unix.Access(filepath.Dir(resolvedPath), unix.W_OK); err != nil {\n\treturn errors.New(\"insufficient permission to write service file; run with sudo\")\n}","typeGuard":"func canWriteFile(path string) bool {\n\tdir := filepath.Dir(path)\n\tf, err := os.CreateTemp(dir, \".probe\")\n\tif err != nil { return false }\n\tn := f.Name()\n\t_ = f.Close()\n\t_ = os.Remove(n)\n\treturn true\n}","tryCatchPattern":"if err := st.Generate(args); err != nil {\n\tif strings.Contains(err.Error(), \"error writing\") {\n\t\tif strings.Contains(err.Error(), \"permission denied\") {\n\t\t\t// re-run with sudo\n\t\t} else if strings.Contains(err.Error(), \"no space left\") {\n\t\t\t// free disk space and retry\n\t\t}\n\t}\n\treturn err\n}","preventionTips":["Always install services with elevated privileges","Check disk space (df -h) before automated installs","Remove stale/immutable plists before reinstalling","Verify MDM/endpoint software does not block writes to /Library/LaunchDaemons"],"tags":["go","filesystem","file-write","permissions","macos","launchd"],"backgroundTag":"file-write-permission-denied","analyzedSha":"2253eeeb25a44a713a4b60b8ba1e1b3f377d1a0f","analyzedAt":"2026-09-06T04:14:33.757Z","contentChangedAt":"2026-09-06T04:14:33.757Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}