Почему и как создать сторожевой таймер в какао / Objective-C - PullRequest
2 голосов
/ 06 сентября 2010

Всем счастливого понедельника!

Вот моя ситуация.Любая помощь очень ценится!

Я создал исполняемый файл, который после установки помещается в папку «Агенты запуска» на машине.Теоретически он должен работать постоянно, собирая данные каждую секунду.Он может остановиться, когда машина спит, но перезапустить, когда компьютер снова активируется.

Вот моя проблема: иногда программа просто самопроизвольно останавливается , обычно после пары дней работы.Если кто-то перезагружает компьютер, то программа перезапускается и снова запускается некоторое время, прежде чем возникает та же проблема.

Я не знаю причину этой проблемы, но друг сказал мне, что я могу создать «сторожевой таймер», который каждую минуту будет проверять, работает ли мой исполняемый файл.Если это не так, сторожевой таймер перезапустит исполняемый файл.

Есть какие-нибудь указатели относительно того, как это сделать?Мои приложения написаны на Objective-C и Cocoa и работают на Mac.

Большое спасибо!


РЕДАКТИРОВАТЬ 1

Я будуобъяснить, как приложение работает в меру моих возможностей.В основном это набор методов, написанных на C и Objective C, которые каждую секунду запрашивают информацию о системе:

  • -байт передано
  • -ключение клавиатуры-
  • - активность мыши -
  • - процент использования жесткого диска
  • - процесс с фокусом клавиатуры

... и т. д.

Это делаетэто с использованием API низкого уровня, предоставленного веб-сайтом Apple Developer.Он записывает информацию в файл каждую секунду.Каждый час файл архивируется и создается новый файл.

Пожалуйста, спросите, нужны ли дополнительные разъяснения:)


РЕДАКТИРОВАТЬ 2

Для тех, кому интересно, вот файл plist

 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
     <key>Label</key>
     <string>com.Intel</string>
     <key>OnDemand</key>
     <true/>
     <key>ProgramArguments</key>
     <array>
         <string>/Library/LaunchAgents/Contents/Intel</string>
     </array>
     <key>RunAtLoad</key>
     <true/>
 </dict>
 </plist>

Еще раз спасибо ....


1 Ответ

4 голосов
/ 06 декабря 2010

Вы можете использовать launchd в качестве сторожевого таймера.Просто добавьте следующую пару ключ-значение в файл plist launchd:

 <key>KeepAlive</key>
 <true/>

Это гарантирует, что ваш процесс будет перезапущен в случае сбоя или другого завершения.(Однако, если ваш процесс зависнет, это не поможет.) Чтобы получить полную документацию по KeepAlive и другим ключам запуска, запустите "man launchd.plist" в Терминале.

...