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...
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- .plist
Datei ausgelöst wird, $PATH
enthält die empfangene Datei möglicherweise nicht die Pfade zu einigen Befehlen/Dienstprogrammen, die innerhalb des Skripts aufgerufen werden . Das $PATH
an 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 $PATH
oder 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 $PATH
im Terminal ist, z. B.:
#!/bin/bash
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin
Hinweis: Das $PATH
Obige ist das, was echo $PATH
auf meinem System ausgegeben wird und kann auf Ihrem durchaus anders sein.
#!/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
Es ist definitiv das Skript, da eine unsachgemäße Bearbeitung jede Minute zu Konsolenmeldungen führte. Aber ich kann nicht sehen, was daran falsch ist.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.
mmmmmm
mmmmmm
Benutzer3439894
proc_check.sh
Shell-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.Benutzer3439894
.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.Benutzer3439894
.plist
Ich habe sowohl die als auch die getestet , wobei ich natürlichproc_check.sh
meinen 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?$HOME
launchd
say $PROC is not running
mail
launchd
GAM