From 8780d4353d5638c08b3bfdd24c052fb9c57f80c6 Mon Sep 17 00:00:00 2001 From: Jonathan Lennox Date: Fri, 20 Dec 2024 17:15:45 -0500 Subject: [PATCH] Catch TERM, HUP, and INT signals, and do a clean shutdown. (#2265) --- .../main/kotlin/org/jitsi/videobridge/Main.kt | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/jvb/src/main/kotlin/org/jitsi/videobridge/Main.kt b/jvb/src/main/kotlin/org/jitsi/videobridge/Main.kt index 07b4e4d668..95a5d1cd02 100644 --- a/jvb/src/main/kotlin/org/jitsi/videobridge/Main.kt +++ b/jvb/src/main/kotlin/org/jitsi/videobridge/Main.kt @@ -48,6 +48,7 @@ import org.jitsi.videobridge.version.JvbVersionService import org.jitsi.videobridge.websocket.ColibriWebSocketService import org.jitsi.videobridge.xmpp.XmppConnection import org.jitsi.videobridge.xmpp.config.XmppClientConnectionConfig +import sun.misc.Signal import java.time.Clock import kotlin.concurrent.thread import kotlin.system.exitProcess @@ -163,6 +164,23 @@ fun main() { null } + var exitStatus = 0 + + /* Catch signals and cause them to trigger a clean shutdown. */ + listOf("TERM", "HUP", "INT").forEach { signalName -> + try { + Signal.handle(Signal(signalName)) { signal -> + exitStatus = signal.number + 128 // Matches java.lang.Terminator + logger.info("Caught signal $signal, shutting down.") + + shutdownService.beginShutdown() + } + } catch (e: IllegalArgumentException) { + /* Unknown signal on this platform, or not allowed to register this signal; that's fine. */ + logger.warn("Unable to register signal '$signalName'", e) + } + } + // Block here until the bridge shuts down shutdownService.waitForShutdown() @@ -186,7 +204,7 @@ fun main() { TaskPools.CPU_POOL.shutdownNow() TaskPools.IO_POOL.shutdownNow() - exitProcess(0) + exitProcess(exitStatus) } private fun setupMetaconfigLogger() {