5

OS X上のアプリケーションの1つの状態を監視する方法を探しています。さまざまな通信チャネルのステータスなど、監視する必要のあるコンポーネントがいくつかあります。それらがダウンした場合、監視プロセスは画面上とプッシュ通知の両方でユーザーに警告できるはずです。

XPCサービスは有望に見えますが、アプリがクラッシュした場合、これもサービスを停止すると思いますか、それとも私は間違っていますか?

私が好む解決策は、予期しない終了も監視し、発生した場合はアプリを再起動するものです。

これを行うための最良の方法は何ですか?

4

4 に答える 4

2

通信経路の監視などは、それぞれの特定のコンポーネント(プロセス)で行う必要があると思います。また、予期しないエラーが発生した場合は、そのコンポーネントをすぐに終了して、適切なクリーンアップを確保する必要があります。

プロセスの監視については、以下の Apple Technical Q&A ドキュメントが非常に役に立ちます:
Technical Note TN2050: Observing Process Lifetimes Without Polling

于 2013-01-23T06:49:22.487 に答える
1

メインアプリケーションを子プロセスとして開始し、終了するのを待つアプリを作成できます。終了コードをチェックし、必要に応じて対応することができます。

このアプローチはここで説明されています:https ://stackoverflow.com/a/78095/785411

メインアプリケーションを子プロセスとして実行するための監視プロセスをfork()するために、これはここで説明されています:https ://stackoverflow.com/a/4327062/785411

于 2013-01-23T05:44:09.827 に答える
1

組み込みの機能 Launchd と CrashReporter を利用して、要件を達成できると思います。

Launchdは、バックグラウンド プロセスの起動と監視を目的とした OS X システム スーパーバイザであり、通常は XPC サービスの実行に使用されます。Launchd エージェントは、さまざまなシステム イベントに反応し、プロセスがクラッシュした場合にプロセスを再起動するように構成できます (プロパティ リストKeepAlive/SuccessfulExitのキーで指定) 。

Launchd は、ファイルやディレクトリの監視、スケジュールされた時間、ネットワーク接続のリッスンなど、さまざまなシステム イベントに起動イベントとして反応するように設定できます。

CrashReporterは、すべてのプロセス クラッシュをキャッチしてログに記録する OS X システム機能です。これはAppleSystemLogger 機能を介してログを記録し、リンクされた TechNote に記載されている syslog ツールを使用してアクセスできます。Mountain Lion では、ユーザー プロセスのクラッシュ レポートは~/Library/DiagnosticReports/、クラッシュ イベントごとに作成されたクラッシュ ログと plist ファイルのペアとともに、.

これらの機能をいくつかの方法で使用して要件を達成できると思います.launchdがxpcサービスの実行を担当している場合、クラッシュイベントでサービスを再起動する責任があり、アプリのクラッシュから切り離すことができます.

QueueDirectories新しいログのクラッシュ レポート ディレクトリを監視して (たとえば、プロパティを使用して)、クラッシュ イベントに応答し、アプリケーションを再起動する、または通知を表示する launchd エージェントを作成できます。

于 2013-01-23T06:26:18.967 に答える
0

各プロセスが独自のスレッドで実行される場合、スレッドが有効かどうかを監視するウォッチドッグ プログラムを実行できます。ループで実行され、出力を解析するスクリプトで実行psできます。

ここでさまざまなオプションを確認できます。-Cコマンド名で選択し、-mすべてのスレッドを表示するには、例を参照してください。

于 2013-01-23T05:28:14.440 に答える