2010-09-06 2 views
0

Bonjour les généreux informaticiens! J'ai donc un objet Plist du launchd qui appelle le script shell ci-dessous toutes les 30 secondes. Il vérifie si un programme est en cours d'exécution et si ce n'est pas le cas, il le redémarre. Ou du moins c'est ce que c'est censé faire.Bug Script Variable Bug?

Le problème est que même lorsque le processus a été supprimé, le script shell indique que le processus est toujours en cours d'exécution. Je pense que c'est parce que d'une certaine manière le booléen n'est pas réinitialisé (Ou quelque chose dans ce sens). De l'aide?

n=`ps -ef | grep Intel | grep -v grep | wc -l` 

if [ $n -gt 0 ] 

then 

     echo `date` CURRENTLY RUNNING. >> /Library/A_Intel_WATCHDOG/A_Intel_WatchLog.txt 

else 

    echo `date` not running. ATTEMPTING RESTART... >> /Library/A_Intel_WATCHDOG/A_Intel_WatchLog.txt 
    cd /Library/LaunchAgents/ 
    launchctl load com.Intel.plist 

fi 

EDIT 1

Il a été suggéré que l'ajout d'un argument 'Keep Alive' peut être une bonne solution à mon problème général. Des commentaires?

serait ici mon fichier plist mis à jour qui devrait garantir que mon application ne cesse de courir sans cesse:

<?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/> 
    <key>KeepAlive</key> 
    <true/> 
</dict> 
</plist> 

J'aimerais entendre si les gens pensent cela est correct ou non. Merci beaucoup!

+0

qu'est-ce que 'ps -ef | grep Intel | grep -v grep | wc -l' ou 'ps -ef | grep Intel | grep -v grep | wc -l' sortie? le problème pourrait être que le processus est en quelque sorte encore là. – aularon

+0

Vérifie si le processus Intel est en cours d'exécution :) –

+0

désolé j'ai accidentellement envoyé, vérifiez maintenant :) – aularon

Répondre

1

Pour résoudre le problème immédiat, essayez de vous connecter la sortie de la commande ps:

processes=`ps -ef | grep [I]ntel` 
if [ -n "$processes" ] 
then 
    echo `date` CURRENTLY RUNNING. "$processes" >> /Library/A_Intel_WATCHDOG/A_Intel_WatchLog.txt 
... 

Je pense qu'il ya quelque chose d'autre en cours d'exécution (peut-être même le script lui-même) correspondant à Intel; Cela vous dira dans le journal. Cependant, je pense que ce n'est pas pertinent, car ce script semble essayer de résoudre un problème qui est mieux résolu ailleurs: launchd est entièrement capable de surveiller et de redémarrer les processus qu'il gère (c'est une de ses caractéristiques importantes). Il suffit d'ajouter

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

à /Library/LaunchAgents/com.Intel.plist et launchd redémarre le programme lui-même.

BTW, si pour une raison quelconque vous avez besoin de redémarrer manuellement un processus géré par launchd, launchctl load est la mauvaise incantation - vous voulez launchd start.

+0

Salut Gordon, merci pour tout l'effort. S'il vous plaît vérifier ma modification et laissez-moi savoir ce que vous pensez. Merci encore;) –

+1

Je supprimer le ' OnDemand' bit (c'est une façon obsolète de dire * pas * pour jeep le travail en vie, et je ne sais pas comment il va interagir avec KeepAlive), et se déplacer le script/programme à quelque part que/Library/LaunchAgents/(les seules choses qui devraient être là sont des fichiers .plist, peut-être créer/Library/Scripts/et le mettre là). –