cloudflare/cloudflared · error

error copying stderr from

Error message

error copying stderr from %s to file %s: %w

What it means

PipeCommandOutputToFile runs a diagnostic command and streams its stderr into a file. This error wraps any failure of io.Copy from the command's stderr pipe to the output file, with the command and target file names for context.

Solutions

  1. Check free disk space in os.TempDir() target filesystem
  2. Re-run the diagnostic collection command
  3. Inspect the wrapped error to see whether the read (command) or write (file) side failed
Defensive patterns

Strategy: try-catch

Validate before calling

if fi, err := os.Stat(tempDir); err != nil || !fi.IsDir() { /* pick writable temp dir */ }

Try / catch

collector, err := diagnostic.PipeCommandOutputToFile(ctx, fs, cmd, output)
if err != nil {
	var perr *fs.PathError
	if errors.As(err, &perr) { /* disk/permission issue on output file */ }
	return fmt.Errorf("log collection failed: %w", err)
}

Prevention

When it happens

Trigger: io.Copy(outputHandle, stderrReader) fails mid-stream: disk full while writing the temp log, output file closed/invalid, or read error on the command's stderr pipe (command crashed, pipe broken).

Common situations: cloudflared diagnostic log collection on a host with full disk or read-only /tmp; journalctl/other command killed mid-read.

Understand the failure class

Background: "failed to write file", "Could not save figure", "Error saving remote file" — file write failed: causes and fixes across languages and libraries — this error's family across 38 libraries.

Related errors


AI-assisted analysis of cloudflare/cloudflared@2253eeeb25 (2026-09-06). Data as JSON: /api/errors/c4986f30ebe5f6f2. Report an issue: GitHub.

Appendix: source

Thrown at diagnostic/log_collector_utils.go:50

			"error running command '%s': %w",
			command.String(),
			err,
		)
	}

	_, err = io.Copy(outputHandle, stdoutReader)
	if err != nil {
		return nil, fmt.Errorf(
			"error copying stdout from %s to file %s: %w",
			command.String(),
			outputHandle.Name(),
			err,
		)
	}

	_, err = io.Copy(outputHandle, stderrReader)
	if err != nil {
		return nil, fmt.Errorf(
			"error copying stderr from %s to file %s: %w",
			command.String(),
			outputHandle.Name(),
			err,
		)
	}

	if err := command.Wait(); err != nil {
		return nil, fmt.Errorf(
			"error waiting from command '%s': %w",
			command.String(),
			err,
		)
	}

	return NewLogInformation(outputHandle.Name(), true, false), nil
}

View on GitHub (pinned to 2253eeeb25)