fix(launcher): never leave the server JVM behind after the client is gone #87
No reviewers
Labels
No labels
bug
build
enhancement
headless
P1-critical
P2-high
P3-medium
P4-low
refactoring
No milestone
No project
No assignees
1 participant
Due date
No due date set.
Dependencies
No dependencies set.
Reference
ai-tools/jdt-mcp-server!87
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fix/80-orphan-jvm"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #80
Ursache (an einer lebenden Waise verifiziert)
Die JVM lief in derselben Prozessgruppe wie der Client. Ein gruppenweites Stop-Signal an den Client (SIGTSTP/Ctrl-Z, SIGTTOU) friert die JVM mit ein (Zustand
T). Eine gestoppte JVM reagiert weder auf stdin-EOF noch auf SIGTERM; stirbt der Wrapper, wird sie reparented und lebt ewig. Befund auf dem Entwicklungsrechner heute:claudeselbst im ZustandTl, JVM in dessen Prozessgruppe, Wrapper als Zombie, JVM ohne Terminal (alle stdio-FDs Sockets). Die SIGTTOU-über-stderr-Hypothese aus dem Issue ist damit widerlegt.Fix, drei unabhängige Ebenen
set -m); Wrapper leitet TERM/INT/HUP alsCONT+ Signal weiter und wartet weiter, damit der echte Exit-Code für die Recovery bleibt. Recovery feuert nicht mehr bei Client-initiiertem Ende (Signal oder Exit 0). Vorher hat ein Client, der innerhalb von 30 s wieder abbaute, den Workspace gelöscht und den Server ohne Client neu gestartet.ParentProcessWatchdog: JVM pollt ihren Parent-PID (2 s) und fährt herunter, sobald sie reparented wurde (Wrapper SIGKILLed oder abgestürzt).ExitDeadline: Nach Shutdown-Entscheidung hält die JVM nach 60 s hart an, falls der geordnete Pfad hängt.IApplication.stop()stoppt jetzt auch den stdio-Transport, sonst wartet der Framework-Shutdown auf stdin.Tests
Neu:
tests/lifecycle-test.sh(stdin-EOF, SIGTERM an Wrapper, gestoppte JVM + SIGTERM, SIGKILL an Wrapper, eigene Prozessgruppe), in CI eingehängt.Smoke-Tests 9/9. Nebenbei gefixt:
fail()im Test-Helper brach unterset -ebeim ersten FAIL ohne Detail den ganzen Lauf ab.Nicht angefasst:
jdtls-mcp.cmd(Windows) – dort greifen nur Ebene 2 und 3.🤖 Generated with Claude Code
https://claude.ai/code/session_0132uJuiDFWGyUk9YCzFPzVK