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