2010-09-06 15 views
2

Joyeux lundi à vous tous!Le pourquoi et le comment de créer un chien de garde dans Cocoa/Objective-C

Voici ma situation. Toute aide grandement appréciée!

J'ai créé un exécutable qui, une fois installé, est placé dans le dossier Launch Agents de la machine. En théorie, il devrait fonctionner perpétuellement, en recueillant des données chaque seconde. Il peut s'arrêter lorsque la machine est en veille, mais redémarrer lorsque l'ordinateur est réactivé.

Voici mon problème: parfois le programme s'arrête spontanément, généralement après quelques jours de fonctionnement. Si l'on redémarre l'ordinateur, le programme redémarre et s'exécute pendant un certain temps avant que le même problème se produise. Je n'ai aucune idée de la raison de ce problème, mais un ami m'a dit que je pouvais créer un chien de garde que chaque minute vérifierait si mon exécutable est en cours d'exécution. Si ce n'est pas le cas, le chien de garde va redémarrer l'exécutable.

Des pointeurs sur la façon de procéder? Mes applications sont écrites en Objective-C et Cocoa et fonctionnent sur Mac.

Merci beaucoup!


EDIT 1

Je vais vous expliquer comment l'application fonctionne au mieux de mes capacités. Il est essentiellement une collection de méthodes écrites en C et Objective C qui interroge des informations sur le système chaque seconde:

  • -bytes transmis
  • -clavier activité-
  • -mouse activité-
  • -pourcentage de harddrive épuisé
  • -process qui a le focus clavier

... etc. Il le fait en utilisant des API de bas niveau fournies par le site Web du développeur Apple. Il écrit les informations dans un fichier toutes les secondes. Chaque heure, le fichier est compressé et un nouveau fichier est créé.

S'il vous plaît demander si plus de précisions est nécessaire :)


EDIT 2

Pour ceux qui se demandent, voici le fichier 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> 

Merci encore .. ..


+0

Vous aurez probablement plus de chance si vous nous dites comment vous faites les choses maintenant. – jer

+0

@jer, Merci pour votre intérêt. Pas vraiment sûr de ce que vous voulez clarifié cependant. Mon exécutable est un programme qui recueille des données comme le nombre d'octets transmis, chaque seconde. C'est un démon lancé au démarrage car il est placé dans le dossier Launch Agents complet avec un fichier plist. Tout conseil apprécié. –

+0

Ce que je vous demande, c'est de décrire votre programme, non pas qu'il existe, mais comment il fonctionne actuellement puisque vous demandez des solutions de rechange, mieux vaut savoir comment cela se fait maintenant. – jer

Répondre

4

Vous pouvez utiliser launchd comme chien de garde.Il suffit d'ajouter la paire valeur clé suivante dans votre fichier plist launchd:

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

Cela garantira que votre processus sera relancée si elle se bloque ou se termine autrement. (Cela n'aidera pas si votre processus se bloque cependant.) Pour une documentation complète sur KeepAlive et d'autres clés launchd, exécutez "man launchd.plist" dans Terminal.