diff --git a/mirai-console/frontend/mirai-console-terminal/src/MiraiConsoleTerminalLoader.kt b/mirai-console/frontend/mirai-console-terminal/src/MiraiConsoleTerminalLoader.kt
index 3efb2fafc..8cf15e300 100644
--- a/mirai-console/frontend/mirai-console-terminal/src/MiraiConsoleTerminalLoader.kt
+++ b/mirai-console/frontend/mirai-console-terminal/src/MiraiConsoleTerminalLoader.kt
@@ -198,6 +198,26 @@ private fun initSignalHandler(): (String) -> Unit {
     val shutdownMonitorLock = AtomicBoolean(false)
     val lastSignalTimestamp = AtomicLong(0)
     return handler@{ signalName ->
+        if (signalName == "WINCH") {
+            // Windows CMD.exe resized
+            return@handler
+        }
+        runCatching {
+            MiraiConsole.mainLogger
+        }.onFailure { // mirai-console not yet initialized
+            System.err.println("[TERMINAL] [WARNING] Received signal $signalName")
+            System.err.println("[TERMINAL] [WARNING] This signal will be processed later because mirai-console not yet initialized.")
+
+            // Try later
+            if (signalName in shutdownSignals) {
+                @OptIn(DelicateCoroutinesApi::class)
+                GlobalScope.launch {
+                    delay(500L)
+                    signalHandler(signalName)
+                }
+            }
+            return@handler
+        }
         // JLine may process other signals
         MiraiConsole.mainLogger.verbose { "Received signal $signalName" }
         if (signalName !in shutdownSignals) return@handler