.sh regelmäßig durch launchd ausführen

Hape42

Idared
Registriert
24.04.18
Beiträge
27
hallo,

wie der Titel schon sagt.
ich habe ein script dass ich alle 2 Stunden ausführen lassen will.
das Script funktioniert wenn ich es im Terminal ausführe.

leider wird es durch launchd nicht ausgeführt, es gibt auch keine Fehlermeldung.

ich habe jetzt mal alles auf ein minimum runtergestript, aber selbst ein ganz kleines test-script funktioniert nicht :confused:

das script time.sh
Code:
testDatei="timetest.txt"
echo `date` > "$testDatei"

launchd-Konfigurationsdatei timeTest.plist
Code:
<?xml version="1.0" encoding="UTF-8"?>                       
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST
1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
        <string>timeTest alle 1 Minute</string>
    <key>ProgramArguments</key>
        <array>
            <string>/Users/hape42/Desktop/AppStore/timeTest.sh</string>
        </array>
    <key>RunAtLoad</key>
        <true/>
    <key>StartInterval</key>
            <integer>60</integer>
</dict>
</plist>

im Terminal lade ich es mit
launchctl load ~/Library/LaunchAgents/timeTest.plist

ich prüfe auch ob es überhaupt geladen ist mit: launchctl list

wenn ich time.sh im Terminal aufrufe wird date in die Datei geschrieben. Also funktioniert das Script und an Rechten sollte es nicht liegen 🤷‍♂️
hat jemand eine Idee was ich falsch mache?
 

Marcel Bresink

Hadelner Sommerprinz
Registriert
28.05.04
Beiträge
8.541
Der Hauptfehler ist, dass Du einen relativen Pfad verwendest, um die Testdatei anzulegen. Du weißt ja nicht, was später der Arbeitsordner sein wird, wenn das System das Skript aufruft. Wahrscheinlich wird im Moment "/" als Arbeitsordner verwendet. Da Dein Benutzer-Account dort kein Schreibrecht hat, wird die Datei nie angelegt.

Die Lösung ist, entweder die zusätzliche Angabe "WorkingDirectory" in die Agent-Beschreibung mit aufzunehmen, oder, was für Skripte generell zu empfehlen ist, nur absolute Pfade zu verwenden.

Aus Sicherheitsgründen solltest Du auch ein "Shebang" verwenden, um zu definieren, mit welcher Shell das Skript aufgerufen werden soll und die dort verwendeten Programme ebenso mit vollständigem Pfad aufrufen. Noch sicherer ist, in der Agent-Beschreibung nicht das Skript, sondern die gewünschte Shell mit dem Skript als Argument aufzurufen, also

Code:
<key>ProgramArguments</key>
        <array>
            <string>/bin/sh</string>
            <string>/Users/hape42/Desktop/AppStore/timeTest.sh</string>
        </array>

Das Skript sollte so aussehen:

Bash:
#!/bin/sh
testDatei="/Users/hape42/Desktop/AppStore/timetest.txt"
/bin/echo `/bin/date` > "$testDatei"
 

Hape42

Idared
Registriert
24.04.18
Beiträge
27
vielen Dank für die Hilfe!

leider läuft es immer noch nicht.

ich hab in der Konsole gefunden:
Jan 14 11:25:06 42 com.apple.xpc.launchd[1] (timeTest alle 1 Minute[1781]): Service exited with abnormal code: 126


/bin/launchctl error 126

126: Request type is no longer supported


zumal das kleine test-script im Terminal einwandfrei läuft
 
Zuletzt bearbeitet:

Hape42

Idared
Registriert
24.04.18
Beiträge
27
ich habe jetzt mal in der timeTest.sh alles auskommentiert
die Fehlermeldung
Jan 14 11:25:06 42 com.apple.xpc.launchd[1] (timeTest alle 1 Minute[1781]): Service exited with abnormal code: 126
kommt trotzdem in der Konsole :confused:
 

Marcel Bresink

Hadelner Sommerprinz
Registriert
28.05.04
Beiträge
8.541
Möglicherweise hast Du die Änderung am Skript mit einem Editor gemacht, der die x-Bits entfernt hat. Dann würde ein

chmod a+x /Users/hape42/Desktop/AppStore/timeTest.sh

helfen.
 
  • Like
Reaktionen: Hape42 und dg2rbf

Hape42

Idared
Registriert
24.04.18
Beiträge
27
Möglicherweise hast Du die Änderung am Skript mit einem Editor gemacht, der die x-Bits entfernt hat. Dann würde ein

chmod a+x /Users/hape42/Desktop/AppStore/timeTest.sh

helfen.
das war auch mal mein Verdacht, hat aber auch nicht geholfen.

Ein Freund kam noch auf die Idee, das .sh im Kalender ausführen zu lassen. Von dort kam dann die Meldung, dass das script nicht signiert ist.

Das brachte uns dann auf die Lösung:
https://developer.apple.com/forums/thread/127403

hab jetzt alles in "/Library/Application Support" in ein Unterverzeichnis gestellt. Jetzt funktioniert das kleine test-script wie es soll. Eine wahrlich schwere Geburt. für "eben mal schnell einen test machen bevor ich mit dem eigentlichen Projekt los lege "

Vielen Dank für die Hilfe!

Vielleicht hilft der Thread ja mal jemand der vor ähnlichen Problemen steht.
 

Marcel Bresink

Hadelner Sommerprinz
Registriert
28.05.04
Beiträge
8.541
Das brachte uns dann auf die Lösung:

Diese dort zitierte Diskussion bezog sich aber auf Downloads oder ähnliche Distribution.

Wenn das eine Lösung ist, musst Du verschwiegen haben, dass die Datei zwischendurch über einen unsicheren Transportkanal verschickt wurde. Skripts, die Du lokal erstellt hast, müssen weder signiert noch notarisiert sein.

Es könnte höchstens noch sein, dass der Editor, mit dem Du das Skript erstellt hast, im Moment als "aus unsicherer Quelle" angesehen wird.
 
  • Like
Reaktionen: dg2rbf

Hape42

Idared
Registriert
24.04.18
Beiträge
27
Diese dort zitierte Diskussion bezog sich aber auf Downloads oder ähnliche Distribution.

Wenn das eine Lösung ist, musst Du verschwiegen haben, dass die Datei zwischendurch über einen unsicheren Transportkanal verschickt wurde. Skripts, die Du lokal erstellt hast, müssen weder signiert noch notarisiert sein.

Es könnte höchstens noch sein, dass der Editor, mit dem Du das Skript erstellt hast, im Moment als "aus unsicherer Quelle" angesehen wird.
das script wurde nicht verschickt. Erstellt mit BBedit

Aber guter Hinweis. Ich kann das ganze ja nochmals neu mit Xcode erstellen und mal sehen was dann passiert.
alles neu mit Xcode erstellt und direkt auf dem desktop abgespeichert. Gleiches Problem.
zur Sicherheit alles ein weiteres mal neu erstellt und im downloads Verzeichnis probiert. gleiches Problem
 
Zuletzt bearbeitet: