我正在尋找一種方法來監視OS X上的其中一個應用程序的狀態。我需要監視的組件有很多,例如各種通信通道的狀態。如果它們停止運行,監視過程應該能夠在屏幕上和通過推送通知來警告用戶。如何監視OS X上的進程?
XPC服務看起來很有希望,但如果應用程序崩潰,我認爲這也會將服務取消,或者我誤會了嗎?
我的首選解決方案是監視意外終止,並重新啓動應用程序,如果它發生。
這樣做的最好方法是什麼?
我正在尋找一種方法來監視OS X上的其中一個應用程序的狀態。我需要監視的組件有很多,例如各種通信通道的狀態。如果它們停止運行,監視過程應該能夠在屏幕上和通過推送通知來警告用戶。如何監視OS X上的進程?
XPC服務看起來很有希望,但如果應用程序崩潰,我認爲這也會將服務取消,或者我誤會了嗎?
我的首選解決方案是監視意外終止,並重新啓動應用程序,如果它發生。
這樣做的最好方法是什麼?
如果每個進程都在其自己的線程中運行,則可以運行一個監視程序來監視線程是否處於活動狀態。在循環中運行ps
並分析輸出的腳本可以做到這一點。
您可以看到各種選項here。例如,請參見-C
以通過命令名稱進行選擇,並請參閱-m
以顯示所有線程。
你可以編寫一個應用程序,它啓動你的主應用程序作爲子進程,並等待它退出。它可以檢查退出代碼,然後根據您的需求做出反應。
這種方法在這裏解釋:https://stackoverflow.com/a/78095/785411
到餐桌()一些監控進程來運行你的主要應用程序作爲一個子進程,這說明如下:https://stackoverflow.com/a/4327062/785411
我想你可能利用內置的設施Launchd和CrashReporter來實現您的要求。
Launchd是OS X系統管理程序,用於啓動和監視後臺進程,通常用於運行XPC服務。的launchd劑可以反應以各種系統事件,並且可以被配置爲重新啓動他們崩潰的事件處理
的launchd可以設置爲以各種系統事件如發射事件作出反應(通過在property list的KeepAlive/SuccessfulExit
鍵指定),包括監視文件和目錄,預定時間或監聽網絡連接。
CrashReporter是捕獲和記錄所有進程崩潰的OS X系統工具。它通過AppleSystemLogger facility進行登錄,並且可以通過鏈接技術說明中記錄的syslog工具進行訪問。在Mountain Lion上,用戶進程崩潰報告以~/Library/DiagnosticReports/
結尾,每個崩潰事件創建一個crashlog和plist文件對。
我認爲你可以通過幾種方式來實現你的需求,如果launchd負責運行xpc服務,它可以承擔在崩潰事件中重新啓動它們的責任,並且它們可以與任何應用程序分離崩潰。
您可以通過監視崩潰報告目錄(例如,使用QueueDirectories
屬性)獲取新日誌並重新啓動應用程序或顯示通知,來編寫響應崩潰事件的launchd代理程序。
我覺得監測溝通渠道等等必須由每個特定的組件(進程)來完成。如果發生意外錯誤,組件應立即退出以確保正確清理。
對於processe監控,低於蘋果技術問答&的文件將是很有益的:
Technical Note TN2050: Observing Process Lifetimes Without Polling
+1有益的參考蘋果技術說明! – Floris