{"record":{"id":"39c2921a2436fb0e","repo":"apache/hadoop","slug":"could-not-set-handler-for-signal-name-this-ca","errorCode":null,"errorMessage":"Could not set handler for signal \"${name}\".This can happen if the JVM has the -Xrs set.","messagePattern":"Could not set handler for signal \"(.+?)\"\\.This can happen if the JVM has the -Xrs set\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/service/launcher/IrqHandler.java","lineNumber":93,"sourceCode":"   */\n  public IrqHandler(String name, Interrupted handler) {\n    Preconditions.checkArgument(name != null, \"Null \\\"name\\\"\");\n    Preconditions.checkArgument(handler != null, \"Null \\\"handler\\\"\");\n    this.handler = handler;\n    this.name = name;\n  }\n\n  /**\n   * Bind to the interrupt handler.\n   * @throws IllegalArgumentException if the exception could not be set\n   */\n  public void bind() {\n    Preconditions.checkState(signal == null, \"Handler already bound\");\n    try {\n      signal = new SignalUtil.Signal(name);\n      SignalUtil.handle(signal, this);\n    } catch (IllegalArgumentException e) {\n      throw new IllegalArgumentException(\n          \"Could not set handler for signal \\\"\" + name + \"\\\".\"\n          + \"This can happen if the JVM has the -Xrs set.\",\n          e);\n    }\n  }\n\n  /**\n   * @return the signal name.\n   */\n  public String getName() {\n    return name;\n  }\n\n  /**\n   * Raise the signal.\n   */\n  public void raise() {\n    SignalUtil.raise(signal);","sourceCodeStart":75,"sourceCodeEnd":111,"githubUrl":"https://github.com/apache/hadoop/blob/2add9630210752f88ceb1bb74eb65e37bf41da8e/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/service/launcher/IrqHandler.java#L75-L111","documentation":"The ServiceLauncher registers graceful-shutdown handlers for SIGINT (IrqHandler.CONTROL_C=\"INT\") and SIGTERM via InterruptEscalator.register() -> IrqHandler.bind(), which installs a sun.misc.Signal handler. If the JVM refuses the registration, bind throws IllegalArgumentException \"Could not set handler for signal \\\"<name>\\\". This can happen if the JVM has the -Xrs set.\" - -Xrs disables the signal machinery, and some signal names simply do not exist on a given OS.","triggerScenarios":"Launching any ServiceLauncher-based main class with -Xrs in the JVM options (HADOOP_OPTS, JAVA_OPTS, container wrappers like dumb-init-based images); binding a signal name the platform lacks (e.g. \"HUP\" on Windows); the signal already claimed by another native handler.","commonSituations":"Container/base-image hardening scripts that copy -Xrs from other JVM deployments; orchestration layers that add -Xrs to suppress signal threads; JVM signal conflicts with native profilers or agents.","solutions":["Remove -Xrs from the JVM options of processes launched via ServiceLauncher so INT/TERM handlers can bind.","If signals are truly unavailable, rely on the separately registered ServiceShutdownHook for orderly shutdown and skip/soft-fail interrupt registration.","On cross-platform code, only register signal names valid for the current OS (INT/TERM are safe; HUP is not on Windows)."],"exampleFix":"# before: launch fails binding INT/TERM\nexport HADOOP_OPTS=\"-Xrs\"\nhadoop org.example.MyService\n# after: drop -Xrs so ServiceLauncher can bind signal handlers\nexport HADOOP_OPTS=\"\"\nhadoop org.example.MyService\n\n// or in code: degrade gracefully when signals are unavailable\ntry { interruptEscalator.register(IrqHandler.SIGTERM); }\ncatch (IllegalArgumentException e) { LOG.warn(\"signal handling disabled: {}\", e.getMessage()); }","handlingStrategy":"fallback","validationCode":"// Detect -Xrs before registering signal handlers\nimport java.lang.management.ManagementFactory;\nboolean xrs = ManagementFactory.getRuntimeMXBean().getInputArguments()\n    .stream().anyMatch(a -> a.equals(\"-Xrs\"));\nif (xrs) {\n  LOG.warn(\"-Xrs present: skipping IrqHandler bind; rely on shutdown hooks\");\n} else {\n  interruptEscalator.register(IrqHandler.CONTROL_C);\n  interruptEscalator.register(IrqHandler.SIGTERM);\n}","typeGuard":null,"tryCatchPattern":"try {\n  handler.bind();\n} catch (IllegalArgumentException e) {\n  // signals unavailable (-Xrs / platform): degrade to ServiceShutdownHook-based shutdown\n  LOG.warn(\"Signal handling disabled: {}\", e.getMessage());\n}","preventionTips":["Do not add -Xrs to JVMs that launch ServiceLauncher-based services.","Prefer platform-safe signal names (INT, TERM) when registering handlers.","Test kill -TERM behavior in container images during bring-up."],"tags":["jvm","signals","service-launcher","shutdown","xrs"],"backgroundTag":"jvm-signal-handling-unavailable","analyzedSha":"2add9630210752f88ceb1bb74eb65e37bf41da8e","analyzedAt":"2026-08-22T19:55:07.957Z","schemaVersion":2},"datasetVersion":"2026-08-23T01:17:44.959Z"}