{"record":{"id":"cc4ac670eca63dc0","repo":"hashicorp/nomad","slug":"qemu-driver-can-t-signal-commands","errorCode":null,"errorMessage":"QEMU driver can't signal commands","messagePattern":"QEMU driver can't signal commands","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"drivers/qemu/driver.go","lineNumber":810,"sourceCode":"\n\treturn handle.TaskStatus(), nil\n}\n\nfunc (d *Driver) TaskStats(ctx context.Context, taskID string, interval time.Duration) (<-chan *drivers.TaskResourceUsage, error) {\n\thandle, ok := d.tasks.Get(taskID)\n\tif !ok {\n\t\treturn nil, drivers.ErrTaskNotFound\n\t}\n\n\treturn handle.exec.Stats(ctx, interval)\n}\n\nfunc (d *Driver) TaskEvents(ctx context.Context) (<-chan *drivers.TaskEvent, error) {\n\treturn d.eventer.TaskEvents(ctx)\n}\n\nfunc (d *Driver) SignalTask(_ string, _ string) error {\n\treturn fmt.Errorf(\"QEMU driver can't signal commands\")\n}\n\nfunc (d *Driver) ExecTask(_ string, _ []string, _ time.Duration) (*drivers.ExecTaskResult, error) {\n\treturn nil, fmt.Errorf(\"QEMU driver can't execute commands\")\n\n}\n\n// GetAbsolutePath returns the absolute path of the passed binary by resolving\n// it in the path and following symlinks.\nfunc GetAbsolutePath(bin string) (string, error) {\n\tlp, err := exec.LookPath(bin)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"failed to resolve path to %q executable: %v\", bin, err)\n\t}\n\n\treturn filepath.EvalSymlinks(lp)\n}\n","sourceCodeStart":792,"sourceCodeEnd":828,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/drivers/qemu/driver.go#L792-L828","documentation":"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.","triggerScenarios":"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.","commonSituations":"Job specs with a signal stanza on a QEMU task; template siphon signals; tooling that generically signals all task drivers.","solutions":["Remove signal usage from the QEMU task configuration/job spec","Handle the signal inside the guest VM instead of via the Nomad driver","Check driver capabilities via TaskCapabilities/DriverSignal handling before signaling"],"exampleFix":"// before\nerr := driver.SignalTask(taskID, \"SIGUSR1\") // QEMU driver can't signal commands\n// after\n// deliver the signal inside the VM, e.g. via SSH/exec into the guest","handlingStrategy":"validation","validationCode":"// Go: gate on driver support before signaling\nif driverName == \"qemu\" {\n    return fmt.Errorf(\"signaling unsupported for qemu tasks\")\n}","typeGuard":null,"tryCatchPattern":"if err := drv.SignalTask(id, sig); err != nil && strings.Contains(err.Error(), \"can't signal\") {\n    // route signal inside guest VM instead\n}","preventionTips":["Never configure signal stanzas on QEMU tasks","Consult driver capability docs before calling SignalTask","Use guest-internal mechanisms (SSH, QEMU guest agent) for signals"],"tags":["qemu","signal","unsupported-operation","nomad-driver"],"backgroundTag":"operation-not-supported","analyzedSha":"482b49bf1aec006f089bcfc7e632d8f6ac303e5e","analyzedAt":"2026-09-04T07:54:14.808Z","contentChangedAt":"2026-09-04T07:54:14.808Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}