hashicorp/nomad · error

failed to create stderr

Error message

failed to create stderr: %v

What it means

ExecCommand.Stderr() mirrors Stdout(): it lazily opens a FIFO writer at StderrPath to stream task stderr. If fifo.OpenWriter on the stderr path fails, the error is wrapped with this message and Launch fails.

Solutions

  1. Verify the stderr fifo exists in the alloc dir; restart the allocation if missing
  2. Correct ownership/permissions on the alloc/log directories
  3. Check audit logs for SELinux/apparmor denials on the path
  4. Compare with the stdout error — if both fail, the alloc dir is the problem

Example fix

// before
// SELinux: 'denied { write } for comm=nomad path=.../stderr.fifo'
// after
// semanage fcontext -a -t container_file_t '.../stderr.fifo' && restorecon -v .../stderr.fifo
Defensive patterns

Strategy: try-catch

Validate before calling

func stderrFifoReady(path string) error {
  fi, err := os.Stat(path)
  if err != nil { return fmt.Errorf("stderr fifo missing: %w", err) }
  if fi.Mode()&os.ModeNamedPipe == 0 { return fmt.Errorf("%s is not a fifo", path) }
  f, err := os.OpenFile(path, os.O_WRONLY, 0)
  if err != nil { return err }
  f.Close()
  return nil
}

Try / catch

if err := launchTask(); err != nil {
  if strings.Contains(err.Error(), "failed to create stderr") {
    log.Printf("stderr fifo broken: %v — check alloc dir perms", err)
    return restartAllocation()
  }
  return err
}

Prevention

When it happens

Trigger: Launch() calls command.Stderr() and fifo.OpenWriter(c.StderrPath) errors — missing fifo, permission denied, or path deleted between stdout and stderr opens.

Common situations: Same as stdout fifo failures: allocation dir permission problems, premature cleanup, MAC policy (SELinux) denials, disk full preventing pipe allocation is rare but possible.

Related errors


AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04). Data as JSON: /api/errors/bc95b046155eeb69. Report an issue: GitHub.

Appendix: source

Thrown at drivers/shared/executor/executor.go:285

			f, err := fifo.OpenWriter(c.StdoutPath)
			if err != nil {
				return nil, fmt.Errorf("failed to create stdout: %v", err)
			}
			c.stdout = f
		} else {
			c.stdout = nopCloser{io.Discard}
		}
	}
	return c.stdout, nil
}

// Stderr returns a writer for the configured file descriptor
func (c *ExecCommand) Stderr() (io.WriteCloser, error) {
	if c.stderr == nil {
		if c.StderrPath != "" && c.StderrPath != os.DevNull {
			f, err := fifo.OpenWriter(c.StderrPath)
			if err != nil {
				return nil, fmt.Errorf("failed to create stderr: %v", err)
			}
			c.stderr = f
		} else {
			c.stderr = nopCloser{io.Discard}
		}
	}
	return c.stderr, nil
}

func (c *ExecCommand) Close() {
	if c.stdout != nil {
		c.stdout.Close()
	}
	if c.stderr != nil {
		c.stderr.Close()
	}
}

View on GitHub (pinned to 482b49bf1a)