2017-09-25 98 views
0

我是Mac OSX新手,我正在嘗試開發一個守護進程(我熟悉windows服務,並試圖實現相同的目標)。Mac OSX LaunchDaemon在卸載時運行一些東西

我做了什麼至今:

託管寫在LaunchDaemons plist文件中(我發現,這些守護進程在系統帳戶,而不是用戶的身份運行,就像使用本地系統權限的Windows服務)。

我設法讓它在啓動時運行,並運行我的簡單的hello world應用程序,該應用程序每10秒將一些內容寫入文件。

問題是,當我用launchd卸載守護進程時,它只是殺死了我的進程。 有沒有辦法讓守護進程在卸載時運行其他的東西,或者向我的進程傳達它正在關閉,所以我可以在我的代碼中執行卸載操作?

謝謝

回答

1

守護程序的生命週期是由蘋果記錄,他們描述瞭如何如果您使用的Objective-C或斯威夫特處理Terminating Processes

,你應該能夠實現applicationshouldterminate委託方法。

如果你不使用可可:

非可可應用程序收到「退出應用程序」蘋果事件(kAEQuitApplication),出於禮貌,讓他們有機會正常關閉

最後,因爲你正在運行一個守護進程(後臺進程)

後臺進程,過程略有不同。 loginwindow程序通過發送一個Quit Application Apple事件(kAEQuitApplication)來通知進程它將要被終止。但是,與前臺進程不同,loginwindow不會等待回覆。無論返回的錯誤是什麼,它都會通過發送一個SIGKILL信號來終止任何開放的後臺進程。

如果系統正在關閉或重新啓動,它會向所有守護程序發送一個SIGTERM信號,幾秒鐘之後會發出SIGKILL信號。

有關於處理SIGTERM here.

+0

這是非常有用的討論,謝謝。我的應用程序是用.Net Core編寫的,我會嘗試找到一種方法來在那裏接收kAEQuitApplication事件。然而,在我的plist文件中,我實際上運行「dotnet」作爲參數,所以它可能有點棘手。如果我得到一些結果,我會告訴你。 –