Soll launchd „verpasste“ Ereignisse aufnehmen?

4

Ich habe gelesen, dass launchd das Ereignis auslöst, wenn der Computer in den Energiesparmodus wechselt, wenn der Computer aufwacht.

Meine Frage bezieht sich auf einen Computer, der heruntergefahren ist. Wenn der Computer ausgeschaltet ist, wenn ein Startereignis auftritt, soll er dann beim nächsten Einschalten ausgeführt werden?

Ich frage, weil ich ein Ereignis (Agent?) Erstellt habe, das jeden Tag um 09:45 Uhr ausgeführt wird. Aber oft ist die Maschine zu diesem Zeitpunkt ausgeschaltet. Nach dem Einschalten des Computers wird die Ausgabe des Ereignisses (eine E-Mail wird gesendet) nicht angezeigt. Ich versuche einzugrenzen, ob dies beabsichtigtes Verhalten ist oder ob ich etwas durcheinander gebracht habe.

Sam Axe
quelle

Antworten:

4

Es ist auf Jobs beschränkt, die während des Ruhezustands (nicht beim Herunterfahren) und durch einen StartCalendarInterval-Parameter (nicht StartInterval) geplant wurden.

Programmierhandbuch für Daemons und Dienste: Planen von zeitgesteuerten Jobs

Wenn Sie einen launchdJob planen, indem Sie den StartCalendarIntervalSchlüssel setzen, und der Computer schläft, wenn der Job hätte ausgeführt werden sollen, wird Ihr Job ausgeführt, wenn der Computer aufwacht. Wenn der Computer jedoch ausgeschaltet ist, als der Job hätte ausgeführt werden sollen, wird der Job erst zum nächsten festgelegten Zeitpunkt ausgeführt.

Alle anderen launchdAufträge werden übersprungen, wenn der Computer ausgeschaltet ist oder schläft. Sie werden erst zum nächsten festgelegten Zeitpunkt ausgeführt.

Lri
quelle
1

Möglicherweise schlägt das Ereignis fehl, da es ausgeführt wird, bevor die Internetverbindung vollständig hergestellt ist.

Hier einige Informationen aus dem Artikel Jobs mit launchd planen :

Wenn Ihr Computer häufig in den Energiesparmodus wechselt, ist er in den Energiesparmodus versetzt, wenn Aufträge ausgeführt werden sollen. Dies bedeutet, dass er sofort nach dem Aufwachen ausgeführt wird, möglicherweise bevor eine Verbindung zum Internet hergestellt wird. Ich habe mit KeepAlive und NetworkState experimentiert , um einen Auftrag zu erhalten, der sich wiederholt, bis eine Netzwerkverbindung besteht. Sie können auch SuccessfulExit verwenden, um das Skript so zu schreiben, dass es nur einen Code ungleich Null zurückgibt, der bedeutet, dass es in 10 Sekunden erneut ausgeführt wird. Bei beiden Methoden wird das Skript alle 10 Sekunden ausgeführt (und schlägt vermutlich fehl), wenn Sie keine Internetverbindung haben. Eine bessere Idee wäre, nur 5 Sekunden am Anfang Ihres Skripts zu schlafen. Oder Sie könnten die Lauffrequenz verdoppeln und auf das Beste hoffen.

Harrymc
quelle