Script automatisch um bestimmte Uhrzeit ausführen

B

Blentux

Mitglied
Thread Starter
Dabei seit
07.04.2022
Beiträge
4
Reaktionspunkte
0
Moin zusammen,

ich möchte ein Shellscript automatisch um eine bestimmte Uhrzeit ausführen lassen. Vorab muss ich sagen, dass ich noch nicht so fit mit macOS bin, besonders was Automatisierung angeht. Komme ursprünglich aus der Linux-Welt und bin cron gewohnt ^^

Nachdem ich mich also ein wenig eingelesen habe, habe ich für launchd eine .plist Datei in /Library/LaunchAgents geladen und mit
Code:
launchctl bootstrap gui/504 /Library/LaunchAgents/com.myuser.myscript.plist
ins LaunchAgents-Verzeichnis geladen und startklar gemacht. Das hat ohne Probleme funktioniert.
Code:
launchctl list | grep myuser
gibt folgende Meldung aus:
Code:
-    0    com.myuser.myscript

Das auszuführende Script liegt bei mir im Downloads-Verzeichnis und hat volle Ausführungsrechte (rwxrwxrwx), gehört zur Gruppe root und dem User wheel.
Die .plist Datei gehört ebenfalls zur Gruppe root und User wheel, hat aber nur Lese- und Schreibrechte (rw-r--r--).

Die .plist Datei sieht folgendermaßen aus:
Code:
<?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>Label</key>
    <string>com.myuser.myscript</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>/Users/myuser/Downloads/script.sh</string>
    </array>
    <key>WorkingDirectory</key>
    <string>/Users/myuser/Downloads</string>
    <key>StandardOutPath</key>
    <string>/Users/myuser/Downloads/myuserlogs/out.txt</string>
    <key>StandardErrorPath</key>
    <string>/Users/myuser/DOwnloads/myuserlogs/error.txt</string>
    <key>StartCalendarInterval</key>
    <dict>
      <key>Hour</key>
      <integer>16</integer>
      <key>Minute</key>
      <integer>10</integer>
    </dict>
</dict>
</plist>

Wie man an der .plist Datei sieht, soll launchd das Script um 16:10 Uhr ausgeführt werden.
Leider funktioniert dies nicht. Im Systemlog finde ich folgende Meldungen:

Code:
User:~ myuser$ cat /var/log/system.log | grep myuser
Mar 31 12:50:05 User com.apple.xpc.launchd[1] (com.myuser.myscript[803]): Service exited with abnormal code: 127
Mar 31 15:00:04 User com.apple.xpc.launchd[1] (com.myuser.myscript[677]): Service exited with abnormal code: 127
Mar 31 15:30:00 User com.apple.xpc.launchd[1] (com.myuser.myscript[669]): Service could not initialize: 20G80: xpcproxy + 23787 [839][12D7C9E4-2F89-3A76-A1C0-D310F417BC41]: 0x1
Mar 31 15:30:00 User com.apple.xpc.launchd[1] (com.myuser.myscript[669]): Service exited with abnormal code: 78
Mar 31 15:53:18 User com.apple.xpc.launchd[1] (com.myuser.myscript[897]): Service could not initialize: 20G80: xpcproxy + 23787 [839][12D7C9E4-2F89-3A76-A1C0-D310F417BC41]: 0x1
Mar 31 15:53:18 User com.apple.xpc.launchd[1] (com.myuser.myscript[897]): Service exited with abnormal code: 78
Mar 31 15:57:04 User com.apple.xpc.launchd[1] (com.myuser.myscript[934]): Service could not initialize: 20G80: xpcproxy + 23787 [839][12D7C9E4-2F89-3A76-A1C0-D310F417BC41]: 0x1
Mar 31 15:57:04 User com.apple.xpc.launchd[1] (com.myuser.myscript[934]): Service exited with abnormal code: 78
Mar 31 15:58:58 User com.apple.xpc.launchd[1] (com.myuser.myscript[957]): Service could not initialize: 20G80: xpcproxy + 23787 [839][12D7C9E4-2F89-3A76-A1C0-D310F417BC41]: 0x1
Mar 31 15:58:58 User com.apple.xpc.launchd[1] (com.myuser.myscript[957]): Service exited with abnormal code: 78
Mar 31 16:10:00 User com.apple.xpc.launchd[1] (com.myuser.myscript[649]): Service could not initialize: 20G80: xpcproxy + 23787 [839][12D7C9E4-2F89-3A76-A1C0-D310F417BC41]: 0x1
Mar 31 16:10:00 User com.apple.xpc.launchd[1] (com.myuser.myscript[649]): Service exited with abnormal code: 78

Hat jemand eine Idee, wo der Fehler liegen könnte? Wäre sehr dankbar :)
 
Erstmal würde das script direkt aufrufen ohne bash.
Shebang ist im script.sh?
Was steht denn im script?
Ist das Verzeichnis für jeden schreibbar?
Der launch job hat ja nicht notwendigerweise den gleichen Benutzer wie myuser.
 
Ja, Shebang ist im Script. Den Eintrag /bin/bash in <array> habe ich nur zur Vorsicht eingefügt.
Das Script selbst gibt eine simple Dialogbox mittels osascript aus:

Code:
#!/bin/bash
osascript -e 'tell app "System Events" to display dialog "Ihr Mac wird in Kürze neu gestartet."' > /dev/null 2&>1

Schreibrechte vom Verzeichnis Downloads, in welchem das Script liegt, sieht so aus:
Code:
drwx------@  56 myuser  staff       1792  7 Apr 08:03 Downloads

Das könnte der Fehler sein, oder? Wobei der User ja alle Rechte hat und das schon genügen müsste...oder muss es wirklich für jeden schreibbar sein? Der launchjob müsste doch von root:wheel ausgeführt werden?
Werde das trotzdem gleich mal testen und dem Verzeichnis volle Rechte geben...

Schon mal vielen Dank für die Hilfe!
 
Eventuell die Datenschutz Einstellungen und das Script darf nicht SystemEvents ansprechen?
 
An den Rechten für den Downloads-Ordner lag es leider nicht.

Die Datenschutz-Einstellungen sind soweit auch korrekt, wenn ich das richtig deute:
einstellungen.png


Ich kriege weiterhin eine Fehlermeldung nach Neuladen der .plist Datei und Neustart des Mac:
Code:
cat /var/log/system.log | grep myuser
Mar 31 12:50:05 User com.apple.xpc.launchd[1] (com.myuser.myscript[803]): Service exited with abnormal code: 127
Mar 31 15:00:04 User com.apple.xpc.launchd[1] (com.myuser.myscript[677]): Service exited with abnormal code: 127
Mar 31 15:30:00 User com.apple.xpc.launchd[1] (com.myuser.myscript[669]): Service could not initialize: 20G80: xpcproxy + 23787 [839][12D7C9E4-2F89-3A76-A1C0-D310F417BC41]: 0x1
Mar 31 15:30:00 User com.apple.xpc.launchd[1] (com.myuser.myscript[669]): Service exited with abnormal code: 78
Mar 31 15:53:18 User com.apple.xpc.launchd[1] (com.myuser.myscript[897]): Service could not initialize: 20G80: xpcproxy + 23787 [839][12D7C9E4-2F89-3A76-A1C0-D310F417BC41]: 0x1
Mar 31 15:53:18 User com.apple.xpc.launchd[1] (com.myuser.myscript[897]): Service exited with abnormal code: 78
Mar 31 15:57:04 User com.apple.xpc.launchd[1] (com.myuser.myscript[934]): Service could not initialize: 20G80: xpcproxy + 23787 [839][12D7C9E4-2F89-3A76-A1C0-D310F417BC41]: 0x1
Mar 31 15:57:04 User com.apple.xpc.launchd[1] (com.myuser.myscript[934]): Service exited with abnormal code: 78
Mar 31 15:58:58 User com.apple.xpc.launchd[1] (com.myuser.myscript[957]): Service could not initialize: 20G80: xpcproxy + 23787 [839][12D7C9E4-2F89-3A76-A1C0-D310F417BC41]: 0x1
Mar 31 15:58:58 User com.apple.xpc.launchd[1] (com.myuser.myscript[957]): Service exited with abnormal code: 78
Mar 31 16:10:00 User com.apple.xpc.launchd[1] (com.myuser.myscript[649]): Service could not initialize: 20G80: xpcproxy + 23787 [839][12D7C9E4-2F89-3A76-A1C0-D310F417BC41]: 0x1
Mar 31 16:10:00 User com.apple.xpc.launchd[1] (com.myuser.myscript[649]): Service exited with abnormal code: 78
Apr  7 13:00:00 User com.apple.xpc.launchd[1] (com.myuser.myscript[800]): Service could not initialize: 20G80: xpcproxy + 23787 [839][12D7C9E4-2F89-3A76-A1C0-D310F417BC41]: 0x1
Apr  7 13:00:00 Error com.apple.xpc.launchd[1] (com.myuser.myscript[800]): Service exited with abnormal code: 78
 
Das Script kannst du von Hand fehlerfrei ausführen?
 
@oneOeight Ja, das funktioniert einwandfrei. Nur automatisiert klappt es nicht.
@SetPatch Huch, ja das meinte ich. Hab's jetzt korrigiert, aber ist es wichtig, ob man es 2&>1 oder 2>&1 schreibt? Das erste scheint ja zu funktionieren...

Könnte es vielleicht mit fehlerhaften Spaces/Tabs in der .plist Datei zusammenhängen? Das Problem hatte ich erst neulich bei einem Python-Script.
 
Könnte es vielleicht mit fehlerhaften Spaces/Tabs in der .plist Datei zusammenhängen? Das Problem hatte ich erst neulich bei einem Python-Script.


Kann sein, dass du über den launchd job und dem anderen User nicht auf die GUI zugreifen darfst.
Würde ich mal mit anderen Script-Inhalt testen.

Hier noch andere Lösungsansätze
https://stackoverflow.com/questions/54503366/launchctl-cant-run-the-binary-and-exits-with-a-code-78
https://stackoverflow.com/questions/34215527/what-does-launchd-status-78-mean-why-my-user-agent-not-running
 
@SetPatch Huch, ja das meinte ich. Hab's jetzt korrigiert, aber ist es wichtig, ob man es 2&>1 oder 2>&1 schreibt? Das erste scheint ja zu funktionieren...

Ja, das ist wichtig! Mit Deiner Variante erzeugst Du eine Datei mit dem Namen 1.
 
Zuletzt bearbeitet:
AFAIK muss osascript auch die entsprechenden Rechte kriegen.

Zudem können, wie ich mich erinnere, GUI Programme nicht via launchd gestartet werden. Lies dir mal die manpage durch.
 
An sich ist es ja kein GUI Programm, sondern nur eine Fernsteuerung/Bedienhilfe.
Die GUI erfolgt ja über SystemEvents.
 
... es wird aber ein GUI-Programm ausgeführt: der display dialog Befehl
 
Hallo,

Zudem können, wie ich mich erinnere, GUI Programme nicht via launchd gestartet werden. Lies dir mal die manpage durch.

Ja nee, das geht schon....


AFAIK muss osascript auch die entsprechenden Rechte kriegen.

Ja, und System Events..... und das "Programm" script.sh ... das ist aber für macOS gar kein "Programm" :p
Naja, oder so ähnlich. Code 78 sind jedenfalls meist fehlende Berechtigungen. Ich vermeide es, sh Scripte mit launchd auszuführen. Deshalb kann ich da keine direkte Lösung für dein Problem liefern ... allerdings mögliche Workarounds:

Ist das weiter oben der komplette Inhalt des Scripts?
Und muss der Dialog wirklich mit "System Events" gestartet werden? (Eine Berechtigungsstufe mehr)
Spricht was dagegen, den Code direkt auszuführen?
Beispiel

Code:
    <key>Program</key>
    <string>/usr/bin/osascript</string>
    <key>ProgramArguments</key>
    <array>
    <string>/usr/bin/osascript</string>
        <string>-e</string>
        <string>tell application "System Events" to display dialog "Ihr Mac wird in Kürze neu gestartet."</string>
    </array>


Gruß
 
Beispiel

Code:
<key>ProgramArguments</key>
<array>
<string>/usr/bin/osascript</string>
<string>-e</string>
<string>tell application "System Events" to display dialog "Ihr Mac wird in Kürze neu gestartet."</string>
</array>
Wenn man es in Program listet, gehört es nicht in ProgramArguments.
Wenn in ProgramArguments, braucht man Program nicht.
 
Jo, ist doppelt gemoppelt...
 
Zurück
Oben Unten