簡體   English   中英

macOS 上的 Swift:在后台應用程序終止時運行代碼

[英]Swift on macOS: Running code on termination of background app

我正在編寫一個在后台作為守護進程運行的 Mac 應用程序。 如何檢測應用程序何時被終止並運行一些清理代碼? 我曾嘗試捕獲諸如SIGTERMSIGINTSIGKILL之類的信號,但我的應用程序結構似乎存在一些問題。

這是我的應用程序從主線程開始的基本流程:

func signalHandler(signal: Int32) { ... }

let signals = [SIGINT, SIGTERM, SIGKILL]
for sig in signals {
    signal(sig, signalHandler)
}

// code to kick off background execution that will occasionally need to run some stuff on the main thread

RunLoop.current.run() // SIGTERM shows up in Xcode on this line, signalHandler not called

如果我使用 Xcode 的停止按鈕停止應用程序或從 Activity Monitor 強制退出,應用程序只會以退出代碼 9 ( SIGKILL ) 退出。 如果我從活動監視器中選擇“退出”,應用程序會收到一個SIGTERM但不會調用處理程序... Xcode 只是突出顯示RunLoop行並說Thread 1: signal SIGTERM

如果沒有RunLoop行,我的應用程序幾乎會立即停止,但我需要讓它保持活動狀態。 同時,我在想那條線可能會阻塞主線程並阻止信號處理程序運行。 有沒有辦法解決這個問題,以便我可以優雅地處理我的應用程序終止?

幾點注意事項:

  • SIGKILL 不能被捕獲
  • 如果附加了調試器,它將攔截信號處理程序,而不是讓信號流過程序; 可以在此處找到解決方法

嘗試打印信號並從命令行啟動程序


func signalHandler(signal: Int32) {
    print("Caught signal \(signal)")
}

Ctrl + C打印Caught signal 2

通過Quit (而不是Force Quit )從 Activity Monitor 終止進程會打印Caught signal 15

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM