{"record":{"id":"9a6139966d001c08","repo":"wavetermdev/waveterm","slug":"unsupported-or-invalid-signal-q","errorCode":null,"errorMessage":"unsupported or invalid signal %q","messagePattern":"unsupported or invalid signal %q","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/util/unixutil/unixutil_unix.go","lineNumber":87,"sourceCode":"\treturn syscall.Kill(pid, syscall.SIGHUP)\n}\n\nfunc IsPidRunning(pid int) bool {\n\tif pid <= 0 {\n\t\treturn false\n\t}\n\terr := syscall.Kill(pid, 0)\n\t// EPERM means no permission, but it exists (ESRCH is not found)\n\tif err == nil || err == syscall.EPERM {\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc SendSignalByName(pid int, sigName string) error {\n\tsig := ParseSignal(sigName)\n\tif sig == nil {\n\t\treturn fmt.Errorf(\"unsupported or invalid signal %q\", sigName)\n\t}\n\tp, err := os.FindProcess(pid)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"process %d not found: %w\", pid, err)\n\t}\n\treturn p.Signal(sig)\n}\n","sourceCodeStart":69,"sourceCodeEnd":95,"githubUrl":"https://github.com/wavetermdev/waveterm/blob/a4447c1563b2df285ab89e76c82f91e1a1a49c1e/pkg/util/unixutil/unixutil_unix.go#L69-L95","documentation":"SendSignalByName looks up an os.Signal via ParseSignal; when the supplied name is not a recognized signal it returns nil and this error is raised. It is a strict validation of user-supplied signal names before any process interaction. The requested pid was never contacted.","triggerScenarios":"Calling SendSignalByName(pid, \"SIGKILL \") with trailing whitespace, an alias like \"kill\" or \"9\", a lowercase name on a platform whose parser is case-sensitive, or any name ParseSignal does not know (e.g. \"SIGUSR3\"). Typically invoked via RemoteProcessSignalCommand with user-typed input.","commonSituations":"Remote command handlers passing raw CLI text or JSON fields straight into the signal API; users typing \"stop\" or \"terminate\" instead of a real signal name; scripts omitting the SIG prefix inconsistently.","solutions":["Validate the signal name with the same parser before calling: check unixutil.ParseSignal(sigName) != nil, or normalize against a known signal list","Normalize input: accept forms with or without the \"SIG\" prefix, trim whitespace, and upper-case before passing through","For numeric input, map integers to signal names first and reject out-of-range values","Return the list of supported signal names in the error/help text so the user can correct the input"],"exampleFix":"// before\nerr := unixutil.SendSignalByName(pid, \"kill\") // error: unsupported or invalid signal \"kill\"\n// after\nname := strings.ToUpper(strings.TrimSpace(input))\nif !strings.HasPrefix(name, \"SIG\") {\n    name = \"SIG\" + name\n}\nif unixutil.ParseSignal(name) == nil {\n    return fmt.Errorf(\"unsupported signal %q; valid: SIGTERM, SIGKILL, SIGHUP, ...\", input)\n}\nerr := unixutil.SendSignalByName(pid, name)","handlingStrategy":"validation","validationCode":"func validSignal(name string) bool {\n    n := strings.ToUpper(strings.TrimSpace(name))\n    if !strings.HasPrefix(n, \"SIG\") { n = \"SIG\" + n }\n    return unixutil.ParseSignal(n) != nil\n}","typeGuard":null,"tryCatchPattern":"if err := unixutil.SendSignalByName(pid, sig); err != nil {\n    if strings.HasPrefix(err.Error(), \"unsupported or invalid signal\") {\n        // show supported signals to the user, do not retry\n    }\n}","preventionTips":["Normalize signal input (trim, upper-case, add SIG prefix) before calling","Validate with ParseSignal before invoking SendSignalByName","Expose the supported signal list in UI/CLI help"],"tags":["signals","process","validation","go"],"backgroundTag":"invalid-signal-name","analyzedSha":"a4447c1563b2df285ab89e76c82f91e1a1a49c1e","analyzedAt":"2026-09-01T15:26:23.972Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}