hashicorp/nomad · error

QEMU driver can't signal commands

Error message

QEMU driver can't signal commands

What it means

Unconditional error from the QEMU driver's SignalTask: QEMU tasks run full VMs, and the driver provides no mechanism to forward signals into the guest, so any signal request is rejected.

Source

Thrown at drivers/qemu/driver.go:810

	return handle.TaskStatus(), nil
}

func (d *Driver) TaskStats(ctx context.Context, taskID string, interval time.Duration) (<-chan *drivers.TaskResourceUsage, error) {
	handle, ok := d.tasks.Get(taskID)
	if !ok {
		return nil, drivers.ErrTaskNotFound
	}

	return handle.exec.Stats(ctx, interval)
}

func (d *Driver) TaskEvents(ctx context.Context) (<-chan *drivers.TaskEvent, error) {
	return d.eventer.TaskEvents(ctx)
}

func (d *Driver) SignalTask(_ string, _ string) error {
	return fmt.Errorf("QEMU driver can't signal commands")
}

func (d *Driver) ExecTask(_ string, _ []string, _ time.Duration) (*drivers.ExecTaskResult, error) {
	return nil, fmt.Errorf("QEMU driver can't execute commands")

}

// GetAbsolutePath returns the absolute path of the passed binary by resolving
// it in the path and following symlinks.
func GetAbsolutePath(bin string) (string, error) {
	lp, err := exec.LookPath(bin)
	if err != nil {
		return "", fmt.Errorf("failed to resolve path to %q executable: %v", bin, err)
	}

	return filepath.EvalSymlinks(lp)
}

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Remove signal usage from the QEMU task configuration/job spec
  2. Handle the signal inside the guest VM instead of via the Nomad driver
  3. Check driver capabilities via TaskCapabilities/DriverSignal handling before signaling

Example fix

// before
err := driver.SignalTask(taskID, "SIGUSR1") // QEMU driver can't signal commands
// after
// deliver the signal inside the VM, e.g. via SSH/exec into the guest
Defensive patterns

Strategy: validation

Validate before calling

// Go: gate on driver support before signaling
if driverName == "qemu" {
    return fmt.Errorf("signaling unsupported for qemu tasks")
}

Try / catch

if err := drv.SignalTask(id, sig); err != nil && strings.Contains(err.Error(), "can't signal") {
    // route signal inside guest VM instead
}

Prevention

When it happens

Trigger: Any call to Driver.SignalTask(taskID, signal) on the QEMU driver, e.g. Nomad's signal task API or a template change triggering a dynamic signal.

Common situations: Job specs with a signal stanza on a QEMU task; template siphon signals; tooling that generically signals all task drivers.

Related errors


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