2 votes

Vérifier si un processus est en cours d'exécution, sinon l'exécuter à nouveau dans le terminal.

Existe-t-il un moyen de vérifier périodiquement si un processus s'exécute avec (probablement avec Apple script, ou un autre shell script) et si ce n'est pas le cas, de l'exécuter dans Terminal ?

J'ai un script PHP qui doit être exécuté, mais au bout d'un certain temps, il s'arrête, et je dois le relancer.

Merci.

5voto

yoliho Points 340

Dans OSX, utilisez launchd pour cela. launchd lancera une commande à la connexion ou au démarrage et si le processus meurt, il le relancera.

Le processus est contrôlé par un fichier .plist. formaté comme défini dans les documents d'Apple l'exemple dans cette page du manuel est pour le cas que vous demandez.

  <?xml version="1.0" encoding="UTF-8"?>
   <!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
   http://www.apple.com/DTDs/PropertyList-1.0.dtd >
   <plist version="1.0">
   <dict>
        <key>Label</key>
        <string>com.example.exampled</string>
        <key>ProgramArguments</key>
        <array>
             <string>exampled</string>
        </array>
        <key>KeepAlive</key>
        <true/>
   </dict>
   </plist>

Si vous voulez qu'il démarre lorsqu'un utilisateur se connecte, ce fichier doit être placé dans ~/Library/LaunchAgents. Si la machine démarre, ce fichier se trouve dans /Library/LaunchDaemons (qui ne peut pas avoir accès à l'interface graphique) mais il sera exécuté en tant que Root à moins que vous n'ajoutiez une clé UserName. (Merci à @Gordon Davisson pour la correction et une relecture de Définitions de la Apple )

Pour faciliter la mise en place du fichier .plist, vous pouvez utiliser les éléments suivants Lingon.app disponible sur le Mac AppStore

0 votes

Correction : pour l'exécuter au démarrage, mettez le fichier dans /Library/LaunchDaemons.

0 votes

@jherran voir méta et beaucoup de méta stack overflow - ne pas utiliser le formatage du code dans le texte brut juste pour le code

3voto

Aaron Lake Points 3622

Si vous vouliez faire cela via un script shell, je ferais quelque chose comme ça :

#!/bin/sh
PROCESS=`ps A | grep PROCESS_NAME | grep -v grep`
if [ "$?" -ne "0" ]; then
        echo "not running"
        ### COMMAND TO EXECUTE HERE ###
        exit 1
fi

Vous pourriez appeler cela via cron toutes les minutes ou presque.

2voto

m000 Points 791

Pourquoi faut-il sonder activement le script ? Pourquoi ne pas simplement le mettre dans une boucle du shell script et le relancer quand il échoue.

#!/bin/sh

let c=1
while ! php -f myscript.php; do
    echo "The script has crashed $c times so far..."
    let "c=c+1"
done

Dans le cas où il n'échoue pas de manière gracieuse, la recherche d'un processus en cours ne vous sauvera pas non plus. Il peut aussi bien continuer à fonctionner sans faire son travail.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X