我正在寻找一种方法来监视我在 OS X 上的一个应用程序的状态。我需要监视许多组件,例如各种通信通道的状态。如果它们出现故障,监控过程应该能够在屏幕上和通过推送通知警告用户。
XPC 服务看起来很有希望,但如果应用程序崩溃,我想这也会导致服务中断,还是我弄错了?
我首选的解决方案还可以监视意外终止,并在发生时重新启动应用程序。
做这个的最好方式是什么?
我正在寻找一种方法来监视我在 OS X 上的一个应用程序的状态。我需要监视许多组件,例如各种通信通道的状态。如果它们出现故障,监控过程应该能够在屏幕上和通过推送通知警告用户。
XPC 服务看起来很有希望,但如果应用程序崩溃,我想这也会导致服务中断,还是我弄错了?
我首选的解决方案还可以监视意外终止,并在发生时重新启动应用程序。
做这个的最好方式是什么?
我认为监控通信渠道等必须由每个特定组件(进程)完成。如果发生意外错误,该组件应立即退出以确保正确清理。
对于进程监控,下面的 Apple 技术问答文档将非常有帮助:
技术说明 TN2050:在没有轮询的情况下观察进程生命周期
您可以编写一个应用程序,将您的主应用程序作为子进程启动,并等待它退出。它可以检查退出代码,然后根据您的需要做出反应。
这种方法在这里解释:https ://stackoverflow.com/a/78095/785411
要 fork() 一些监视进程以将主应用程序作为子进程运行,此处对此进行了说明:https ://stackoverflow.com/a/4327062/785411
我认为您可以利用内置设施 Launchd 和 CrashReporter 来满足您的要求。
Launchd是 OS X 系统管理器,用于启动和监控后台进程,通常用于运行 XPC 服务。启动的代理可以对各种系统事件做出反应,并且可以配置为在进程崩溃时重新启动进程(通过属性列表KeepAlive/SuccessfulExit
中的键指定)
Launchd 可以设置为响应各种系统事件作为启动事件,包括监视文件和目录、预定时间或监听网络连接。
CrashReporter是一种 OS X 系统工具,用于捕获和记录所有进程崩溃。它通过AppleSystemLogger 工具进行记录,并且可以使用链接的技术说明中记录的 syslog 工具进行访问。在 Mountain Lion 上,用户进程崩溃报告以 . 结尾~/Library/DiagnosticReports/
,每个崩溃事件都会创建一个崩溃日志和 plist 文件对。
我认为您可以通过多种方式使用这些功能来满足您的要求,如果 launchd 负责运行 xpc 服务,它可以负责在崩溃事件中重新启动它们,并且它们可以与任何应用程序崩溃分离。
QueueDirectories
您可以编写一个启动代理,通过监控崩溃报告目录(例如使用属性)以获取新日志并重新启动您的应用程序或显示通知,从而响应崩溃事件。
如果每个进程都在自己的线程中运行,您可以运行一个监视程序来监视线程是否处于活动状态。在循环中运行并解析输出的脚本ps
可以做到这一点。
您可以在此处查看各种选项。参见例如-C
按命令名称选择,并-m
显示所有线程。