mirror of
https://github.com/sbt/sbt.git
synced 2026-09-01 10:37:54 +02:00
Running reboot in the sbt shell dropped to the OS shell instead of rebooting. The break was in teardown: Server.shutdown opened with log.info, and during a client-initiated reboot the terminal in scope is that client's already-closed virtual terminal, so the log write throws ClosedChannelException through the terminal proxy. That aborted teardown before the portfile was deleted and the server socket closed, and the exception was swallowed by the shutdown hook (whose own error print goes to the same dead terminal). Server.shutdown now completes its state cleanup (portfile, tokenfile, running flag, server socket) before logging, and CommandExchange.shutdown wraps each channel shutdown and the server shutdown individually so one failing step cannot skip the rest. Fixes #9095 Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>