Controlla se un processo è in esecuzione, se non lo esegui di nuovo in Terminale

2

C'è un modo per controllare periodicamente se un processo è in esecuzione con (probabilmente con lo script Apple o qualche altro script di shell) e se non lo si deve eseguire in Terminale?

Ho uno script PHP che deve essere eseguito, ma dopo un po 'di tempo si rompe, quindi ho bisogno di riavviarlo.

Grazie.

    
posta depi 18.03.2011 - 13:35
fonte

3 risposte

5

In OSX usa launchd per questo. launchd avvierà un comando all'accesso o all'avvio e se il processo muore, verrà riavviato.

Il processo è controllato da un file .plist formattato come definito in Apple docs l'esempio in quella pagina di manuale è per il caso che chiedi.

  <?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>

Se vuoi iniziare quando un utente accede al file va in ~ / Library / LaunchAgents. Se la macchina si avvia, quindi, / Library / LaunchDaemons (che non può accedere alla GUI), ma verrà eseguito come root a meno che non si aggiunga una chiave UserName. (Grazie a @Gordon Davisson per la correzione e una rilettura di definizioni Apple )

Per semplificare l'impostazione di .plist up puoi usare Lingon.app disponibile dal Mac AppStore

    
risposta data 18.03.2011 - 13:48
fonte
3

Se volessi farlo tramite uno script di shell, farei qualcosa del genere:

#!/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

Potresti chiamarlo tramite cron ogni minuto circa.

    
risposta data 18.03.2011 - 13:52
fonte
2

Perché è necessario eseguire attivamente il polling per lo script? Perché non metterlo in un ciclo di script di shell e riavviarlo quando fallisce.

#!/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

Nel caso in cui non fallisca con grazia, il polling per un processo in esecuzione non ti salverà neanche. Potrebbe anche continuare a funzionare mentre non sta facendo il suo lavoro.

    
risposta data 29.03.2011 - 14:36
fonte

Leggi altre domande sui tag