Launchd führt alle zwei Stunden ein Applescript aus

Ich habe ein kleines Applescript geschrieben, das ich alle 2 Stunden automatisch ausführen möchte. Ich habe daher folgenden launchd-Daemon geschrieben (wahrscheinlich ist es ein Agent):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Disabled</key>
        <false/>
        <key>Label</key>
        <string>com.zerowidth.launched.aspect</string>
        <key>Program</key>
        <string>/usr/bin/osascript</string>
        <key>ProgramArguments</key>
        <array>
                <string>osascript</string 
                <string>/Users/***/my_script.scpt</string>
        </array>
        <key>StandardOutPath</key>
        <string>/Users/***/file_log.log</string>
        <key>RunAtLoad</key>
        <true/>
        <key>ThrottleInterval</key>
        <integer>7200</integer>
        <key>KeepAlive</key>
        <true/>
</dict>
</plist>

Dann habe ich Terminal geöffnet und fertig

launchctl load ~/Library/LaunchAgents/com.zerowidth.launched.aspect.plist 

Es funktionierte gut, aber nur einmal und nicht alle zwei Stunden. Beim Überprüfen der Konsole erhielt ich die folgenden Meldungen (und tatsächlich noch viele mehr):

com.apple.xpc.launchd[1] (com.zerowidth.launched.aspect): Dieser Dienst ist so definiert, dass er ständig läuft und von Natur aus ineffizient ist.

16. Dezember 17:02:25 Air-of-myself-2 com.apple.xpc.launchd[1] (com.zerowidth.launched.aspect): Der Dienst lief nur 7 Sekunden lang. Respawn wird um 7193 Sekunden verschoben.

Können Sie mir bitte helfen, zu verstehen, was los ist? Wie kann ich das Apple-Skript alle zwei Stunden ausführen?

Danke.


BEARBEITEN. Ich füge, Roberts Rat folgend, das Python-Skript und das Applescript hinzu.

Hier ist das Python-Skript. Es fordert die Konsole auf, den LocateMe-Befehl auszuführen, und erhält daraus den Breiten- und Längengrad des Ortes, an dem ich mich befinde. Ruft dann eine API auf, um die Sonnenuntergangs- und Sonnenaufgangszeit dieses Ortes zu erhalten. Schließlich entscheidet eine kleine Funktion, ob es Tag ist (Sonnenaufgang < jetzt

output = os.popen('/Users/***/Desktop/LocateMe').read()
###I extract my coordinates 
coord = output[1:25]
lat = float(coord[1:12]) ###latitude
long = float(coord[13:25]) ### longitude

my_sunrise, my_sunset = get_ris_and_set(lat, long) ##this function calls an API that gives sunset and sunrise time in the position given by (lat,long)
my_sunset1 = my_sunset.time()
my_sunrise1 = my_sunrise.time()

result = str(is_day(now.time(), my_sunrise1, my_sunset1))
### compare the time now and returns true if it is day false otherwise    
with open('/Users/***/Desktop/log_file.txt', 'a') as f:
        print(result, file=f)
sys.exit()

Hier ist das Applescript: Es führt das obige Python-Skript aus und liest den booleschen Wert (ob es Tag ist oder nicht). Dann prüft es, ob der Dark Mode auf Mojave eingeschaltet ist und schaltet bei Bedarf um.

tell application id "com.apple.systemevents"
tell application "Terminal"
    do shell script "/usr/local/bin/python3 /Users/***/Desktop/python.py $@"
end tell

tell appearance preferences
    set value to do shell script "tail -n 1 /Users/***/Desktop/log_file.txt"
    if dark mode is true and value = "True" then
        set dark mode to false
    else if dark mode is false and value = "False" then
        set dark mode to true
    else
        return
    end if
end tell
end tell
Wo ist Ihr End-Service-Befehl, damit er wieder ausgeführt werden kann.
@Buscar웃 Es tut mir leid, aber ich bin ein Neuling bei launchd ... Ich bin mir nicht sicher, ob ich Ihren Kommentar verstanden habe. Könntest du bitte etwas deutlicher werden, bitte? Vielen Dank für Ihre freundliche Hilfe!
launchdIhr Skript alle zwei Stunden ordnungsgemäß ausgeführt wird. Es scheint jedoch, dass Ihr Skript kontinuierlich ausgeführt wird und es ineffizient ist, ein kontinuierlich ausgeführtes Skript in einem festgelegten Intervall auszuführen. Was soll dein Script machen?
Mhm, ich verstehe. Danke für deine Antwort! Mein Applescript führt ein Python-Skript (!) aus, das im Grunde die aktuelle Uhrzeit überprüft und entscheidet, ob es Tag oder Nacht ist (abhängig von meiner Position). Dann schaltet es den Mojave Dark-Mode ein / aus. Wie kann ich damit besser umgehen? Vielleicht sollte ich im Applescript eine Anweisung setzen, damit es nicht ständig läuft... Danke!
Angenommen, Ihr Python-Skript wird ausgeführt, überprüft das Datum, tut, was es tun muss, und wird dann beendet. Dann wird es nicht kontinuierlich ausgeführt (es sei denn, Sie haben einen Fehler, bei dem es auf etwas wartet). Warum haben Sie es auf true gesetzt KeepAlive?
Siehe diese Antwort und diese Antwort für weitere Details.
@Allan Vielen Dank, Ihre Kommentare waren hilfreich. Eigentlich bin ich mir nicht sicher, ob mein Python-Skript "beendet": wie soll ich das machen? Wahrscheinlich versteckt sich das Problem darin, dass das AppleScript nicht beendet wird. Wie soll ich das machen? Gibt es irgendeinen Befehl? [Soll ich übrigens alle meine Skripte posten? Ich habe es noch nicht gemacht, nur weil sie ziemlich lang sind und das würde auch meine Frage werden - abgesehen davon, dass die Drehbücher schrecklich sind und nur Gott und ich wissen, was wir meinen :-) - bald wird es nur noch Gott tun :-):- )] Danke!

Antworten (2)

Ist nicht StartIntervalder Schlüssel zum regelmäßigen Laufen? In Ihrem Fall auf 7200 (Sekunden) eingestellt?

https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html#//apple_ref/doc/uid/10000172i-SW7-SW7

Fantastisch! Es funktioniert genau so, wie ich es wollte, vielen Dank! Wissen Sie übrigens, was der Unterschied zwischen StartInterval und ThrottleInterval ist? Wenn Sie den obigen Code gelesen haben, glauben Sie, dass es eine leichtere Möglichkeit gibt, ihn zu implementieren? Vielen Dank, ich habe vor, Ihre Antwort zu akzeptieren und Ihnen das Kopfgeld zu geben (falls in der Zwischenzeit keine andere Antwort erscheint). Danke! :-D
Ich glaube, ThrottleInterval ist, wie oft Ihr Prozess spawnen darf ; dh wie schnell es wieder laufen darf. Es ist jedoch tatsächlich undokumentiert, also würde ich überhaupt nicht damit herumspielen, wenn Sie nicht müssen.

Wir müssen alle Ihre Skripte sehen. [ wenn sie kurz sind, oder einfach vor dem Posten. ] Sie könnten das Python-Skript von Ihrer plist aufrufen. Vielleicht haben Sie redundante Schleifenmechanismen in Ihren Skripten. Sie sollten Debug-Informationen in Ihre Skripts einfügen. Schreiben Sie in eine Datei in Ihrem Applescript- und Python-Skript. Fügen Sie so etwas wie "date >> mylogfile#1" in das do-Shell-Skript Ihres Applescripts ein. Überprüfen Sie die Syntax im Terminal:

mac $ date >> mylogfile#1
mac $ date >> mylogfile#1
mac $ date >> mylogfile#1
mac $ cat mylogfile#1 
Sun Dec 16 19:32:17 EST 2018
Sun Dec 16 19:32:21 EST 2018
Sun Dec 16 19:32:23 EST 2018

etwas mehr gewicht könnte hilfreich sein. Auf diese Weise können Sie feststellen, ob Ihr Skript aufgerufen wird.

Sie können dies vollständig in Applescript tun. Scrollen Sie nach unten zu „Jetzt müssen wir diesen Befehl regelmäßig im Hintergrund ausführen.“

http://scriptingosx.com/tag/stay-open/

Beachten Sie, wie die Idle-Routine die Zeit zurückgibt, nach der der Idle-Handler erneut aufgerufen wird.

Robert

Vielen Dank für Ihr Interesse und Entschuldigung für die späte Antwort. Guter Punkt, im Leerlauf funktioniert es. Aber ich mag die Leerlauflösung ehrlich gesagt nicht allzu sehr. Am Ende steht eine App, die ich ausführen muss und die immer im Hintergrund auf dem Desktop geöffnet bleibt ... auf jeden Fall möchte ich sie mit launchd einstellen, damit ich etwas Neues lernen kann. Ich werde Ihrem Rat folgen und das gesamte Skript in das OP einfügen. Ich hoffe, dass Sie mir helfen können. Vielen Dank.