Usando launchd per monitorare un programma o un processo in esecuzione

1

Ho scritto un semplice script bash per verificare se un programma (fornito come unico argomento) è in esecuzione e inviare una e-mail a un indirizzo impostato nello script se non lo è. Lo script funziona se eseguito sulla riga di comando, ma non riesco per tutta la vita a farlo funzionare sotto launchd come agente utente (~ / Library / LaunchAgents) dove cerco di impostarlo per funzionare ogni minuto. L'ultima incarnazione del file .plist rilevante è (monitoraggio Dropbox):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!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>greencollar.Dropbox.checkRun</string>
        <key>StartInterval</key>
        <integer>60</integer>
        <key>Program</key>
        <string>/Users/greencollar/Documents/code/proc_check.sh</string>
        <key>ProgramArguments</key>
        <array>
            <string>proc_check.sh</string>
            <string>Dropbox</string>
        </array>
    </dict>
</plist>

Sì: lo script di bash è eseguibile e non ci sono voci nella Console che indicano problemi con il file .plist. Ho provato a fare / bin / bash il programma, ma questo non sembra fare alcuna differenza e leggere execvp (3) sembra suggerire che non lo farebbe. Ho anche provato ad avere tutto sotto <ProgramArguments> senza fortuna. Qualsiasi aiuto sarebbe molto apprezzato in quanto mi sembra piuttosto semplice ed è molto frustrante che non riesco a farlo funzionare!

----------------------------- Modifica 1 ---------------- -----------

Ecco le basi essenziali dello script della shell:

#!/bin/bash
PROC=$1
if ! /usr/bin/pgrep $PROC > /dev/null
then
    /bin/echo "$PROC is not running!" | /usr/bin/mail -s "$PROC down" email@mydomain
fi

Non c'è molto da sbagliare lì ...

    
posta GAM 07.05.2016 - 15:50
fonte

2 risposte

2

Dopo essere arrivati a questo punto, doveva esserci qualche problema con la posta invocata da launchd, quindi ho cercato su di esso e ho trovato questo che ha fatto riferimento a questo . era il file .plist in quanto non includeva la chiave AbandonProcessGroup che consentiva al processo di posta di vivere abbastanza a lungo per funzionare. L'aggiunta di

<key>AbandonProcessGroup</key>
<true/>

ha funzionato.

Mi stavo preparando per questo in quanto stavo usando un .plist generato da un'app di terze parti per "risparmiare tempo". Tali app non sono sempre complete o accurate nei file .plist che producono, apparentemente.

Grazie a @ user3439894 & @ Mark per il loro aiuto.

    
risposta data 09.05.2016 - 07:00
fonte
2

Sto postando questa risposta come risposta perché è troppo per un commento e credo di sapere quale potrebbe essere il problema, anche senza vedere il contenuto dello script di shell proc_check.sh .

Mi sono reso conto dopo aver letto di nuovo la tua domanda e i successivi commenti, dopo aver cancellato la mia prima risposta, il suggerimento era lo script funzionato dalla riga di comando ma non quando chiamato da% % co_de.

Quando viene attivato il file launchd del tuo agente utente, il .plist che riceve non può contenere i percorsi di alcuni comandi / utilità chiamati nello script . Il $PATH passato allo script $PATH shell è solo:

/usr/bin:/bin:/usr/sbin:/sbin

Quindi, qualsiasi programma chiamato nello script che non si trova in proc_check.sh precedente o include il suo nome percorso completo non è in esecuzione quando chiamato da $PATH .

Per risolvere il problema, usa il nome di percorso completo per tutti gli eseguibili chiamati nello script , che non sono nella percentuale sopra launchd , o aggiungi un $PATH statement dopo PATH=... , dove shebang è l'output effettivo di, ... in Terminal, ad esempio:

#!/bin/bash
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin

Nota: il echo $PATH sopra è ciò che è prodotto da $PATH sul mio sistema e potrebbe essere diverso dal tuo.

    
risposta data 07.05.2016 - 21:53
fonte

Leggi altre domande sui tag