Verwenden von launchd zum Überwachen eines laufenden Programms oder Prozesses

Ich habe ein einfaches Bash-Skript geschrieben, um zu überprüfen, ob ein Programm (als einziges Argument angegeben) ausgeführt wird, und eine E-Mail an eine festgelegte Adresse im Skript zu senden, wenn dies nicht der Fall ist. Das Skript funktioniert, wenn es auf der Befehlszeile ausgeführt wird, aber ich kann es für mein ganzes Leben nicht dazu bringen, es unter launchd als Benutzeragenten (~/Library/LaunchAgents) zum Laufen zu bringen, wo ich versuche, es so einzustellen, dass es jede Minute ausgeführt wird. Die neueste Inkarnation der relevanten .plist-Datei ist (Überwachung von 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>

Ja - das Bash-Skript ist ausführbar und nein, es gibt keine Einträge in der Konsole, die auf Probleme mit der .plist-Datei hinweisen. Ich habe versucht, das Programm /bin/bash zu erstellen, aber das scheint keinen Unterschied zu machen, und das Lesen von execvp(3) scheint anzudeuten, dass dies nicht der Fall wäre. Ich habe auch versucht, alles darunter zu haben, <ProgramArguments>ohne Glück. Jede Hilfe wäre sehr willkommen, da mir das ziemlich einfach erscheint und es sehr frustrierend ist, dass ich es nicht zum Laufen bekomme!

----------------------------- 1. Bearbeitung ------------------- --------

Hier sind die abgespeckten Grundlagen des Shell-Skripts:

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

Da kann man nicht viel falsch machen...

Haben Sie den vollständigen Pfad als erstes Argument in ProgramArguments ausgeführt - auch welche Berechtigungen für das Skript? (Der einfache Weg ist, LaunchControl oder andere Programme zu verwenden, um das Skript zu bearbeiten)
Auch wenn Sie sagen, läuft nicht - woher wissen Sie, ob es läuft?
Ohne etwas auszulassen, außer um einen geeigneten Platzhalter für etwas zu setzen, das vertraulich ist, z. B. die tatsächliche E-Mail-Adresse und das Kennwort usw., bearbeiten Sie Ihre Frage, um den Inhalt des proc_check.shShell-Skripts einzuschließen. Denn ohne sie kann es keinen vollständigen Fehlerbehebungsprozess geben, der einfach durchgeführt werden kann oder indem versucht wird, so genau wie möglich zu replizieren, wo das Problem liegt.
@Mark, danke für den Kommentar zu meiner jetzt gelöschten vorherigen Antwort. Es hat mich dazu gebracht, das in der Frage zu testen .plist, was ich zugegebenermaßen nicht hatte, weil ich dachte, ich hätte ein Problem damit gesehen, und es hat ausgelöst (jedenfalls auf meinem System). Also, ich glaube nicht, dass das Problem ist. Meine neue Antwort ist meiner Meinung nach genau richtig, wo das Problem liegen könnte. Ohne den Inhalt des Skripts zu sehen , kann ich natürlich nicht sicher sagen, aber das ist höchstwahrscheinlich, wo das Problem liegen könnte.
.plistIch habe sowohl die als auch die getestet , wobei ich natürlich proc_check.shmeinen und den Rest Ihres Pfads verwendet habe , und dies funktioniert, wenn es für mich beim Testen mit "Caculator" und aufgerufen wird . Ich habe das Senden von E-Mails nicht getestet, da mein System dafür nicht eingerichtet ist. Vielleicht möchten Sie also wie ich testen, um zu sehen, ob das funktioniert, und wenn dies der Fall ist, muss die Fehlerbehebung durchgeführt werden, wie möglicherweise gehandhabt wird, wenn es durch ausgelöst wird . Übrigens, ich verwende OS X 10.8.5, welche Version verwenden Sie? $HOMElaunchdsay $PROC is not runningmaillaunchd
@Mark Ich laufe jetzt mit dem ersten Argument von <ProgramArguments> als vollständigem Pfad. Aber es löste trotzdem aus, ohne das getan zu haben. Ich habe nicht gesagt, dass es nicht läuft. Ich sagte, es hat nicht funktioniert .

Antworten (2)

Ich poste dies als Antwort, weil es zu viel für einen Kommentar ist und ich glaube, ich weiß, was das Problem sein könnte, auch ohne den Inhalt des proc_check.sh Shell-Skripts zu sehen .

Nachdem ich Ihre Frage und die folgenden Kommentare erneut gelesen hatte, wurde mir klar, dass nach dem Löschen meiner ersten Antwort der Hinweis lautete, dass das Skript von der Befehlszeile aus funktionierte, aber nicht, wenn es von aufgerufen wurde launchd.

Wenn Ihre User-Agent- .plistDatei ausgelöst wird, $PATHenthält die empfangene Datei möglicherweise nicht die Pfade zu einigen Befehlen/Dienstprogrammen, die innerhalb des Skripts aufgerufen werden . Das $PATHan die Shell übergebene proc_check.sh Skript ist nur:

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

Daher wird jedes Programm, das im Skript aufgerufen wird , das nicht oben aufgeführt ist $PATHoder seinen vollständig qualifizierten Pfadnamen enthält , nicht ausgeführt, wenn es von aufgerufen wird launchd.

Um dies zu beheben, verwenden Sie entweder den vollständig qualifizierten Pfadnamen für alle im Skript aufgerufenen ausführbaren Dateien , die sich nicht im obigen befinden $PATH, oder fügen Sie eine PATH=...Anweisung nach dem hinzu shebang, wobei ...die tatsächliche Ausgabe von echo $PATHim Terminal ist, z. B.:

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

Hinweis: Das $PATHObige ist das, was echo $PATHauf meinem System ausgegeben wird und kann auf Ihrem durchaus anders sein.

Danke für die bisherigen Kommentare. Ich habe mein Skript auf das Nötigste modifiziert und die vollständigen Pfade zu allen ausführbaren Dateien hinzugefügt, aber es funktioniert immer noch nicht. Hier ist das Skript: #!/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 fiEs ist definitiv das Skript, da eine unsachgemäße Bearbeitung jede Minute zu Konsolenmeldungen führte. Aber ich kann nicht sehen, was daran falsch ist.
@GAM, bitte fügen Sie Ihr Skript Ihrer Frage in einer richtig formatierten Struktur hinzu, nicht in einem Kommentar.

Nachdem ich so weit gekommen war, musste es ein Problem mit dem Aufruf von mail durch launchd geben, also habe ich danach gesucht und das gefunden , das auf this verwiesen hat . Es war die .plist-Datei, da sie den AbandonProcessGroup-Schlüssel nicht enthielt, der es dem Mail-Prozess ermöglichen würde, lange genug zu arbeiten, um zu funktionieren. Hinzufügen

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

hat es funktioniert.

Ich habe mich darauf eingestellt, indem ich eine .plist verwendet habe, die von einer Drittanbieter-App generiert wurde, um "Zeit zu sparen". Offensichtlich sind solche Apps in den von ihnen erzeugten .plist-Dateien nicht immer vollständig oder genau.

Danke an @user3439894 & @Mark für ihre Hilfe.