Hilfe: script per launchctl automatisch starten - bekomme Fehler

tja

ist


???? Schau doch mal in meinen ersten Post. Meine ganzen ersten Tests gehen um ein Script mit dem Inhalt --> echo "Dies ist ein Test"
In dem Post ist auch alles andere drin.
Natürlich habe ich in der Folge alle vorgeschlagenen Änderungen auch durchgeführt - ich bin ja nicht ganz dumm ;-)

ich sage nicht das du dumm bist. Ich beschreibe direkt die Situation, die ich hier bei mir auf beiden Macs laufen habe. Nirgends ist es notwendig, dass bash oder zsh berechtigt werden muss. Nirgends ist es notwendig das das script selbst berechtig werden muss. Und da du offensichtlich zsh scripot nicht ausführen kannst, muss es ja an irgendwas leigen, was mit der config von zsh zu tun hat. Seien es nun die zsh-config-files oder die Standardshell des Terminals (was ich mir aber nicht vorstellen kann, dennoch sein könnte)

Lediglich ein im script vorhandenes binary (bspw "duplicacy") hat separaten Zugriff. Das script nutzt genügend andere mit macOS enthaltene binaries, wie networksetup, awk, cut, date und builtins wie echo. Nichts davon muss berechtigt werden.

Und was dein Testscript betrifft, sieht es für mich (ich habe es ncih nciht anylysiert" so aus, dass es einzig am Ort liegt den du für stderr und stdout nimmst. Es bringt auch nichts, wenn du da mit dem User-key deinen account nimmst. Du brauchst die Berechtigungen zu FP-Vollzugriff. Klar geht bash, aber wie du selbst sagst ist es eher suboptimal. Terminal.app reicht und ist so oder so meist schon gesetzt.

Abgesehen davon bringt der User-key eh nichts, wenn du User-Agents startest. Die werden immer als derjenige User ausgeführt, in dessen Library sie liegen. Es sind ja User-Agents.

Dennoch: du kannst natürlich auch bash nehmen und dafür FP-Vollzugriff geben.
 
@lisanet
Ich habe nun nochmals:
- im script #!/bin/zsh eingetragen
- sichergestellt, dass das "Terminal" Vollzugriff hat und auf /bin/zsh als Standard hat (erweiterte Optionen in meinem User-Profil)
- bash Vollzugriff entzogen

Fehlermeldung in Test1.err: /bin/zsh: can't open input file: /Users/jt/Downloads/Test1.sh

Hier mein script "Test1.sh"
Code:
#!/bin/zsh
echo "Dies ist ein Test"

Hier mein plist file com.jt.test.plist:
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.jt.test</string>
    <key>Program</key>
    <string>/Users/jt/Downloads/Test1.sh</string>
 
    <key>StartInterval</key>
    <integer>60</integer>
 
    <key>StandardErrorPath</key>
    <string>/Users/jt/Downloads/Test1.err</string>
    <key>StandardOutPath</key>
    <string>/Users/jt/Downloads/Test1.log</string>
</dict>
</plist>

was ergibt ein "ls -l" für Rechte? Wie ist die Standardshell des Terminals. Die zsh-config-Files hast du aj bereits bestätigt, dass sie passen.

Alles andere zum Ort für stderr und stdout habe ich oben geschrieben.

Und wie immer: Ich kann leider nicht jede denkbare Variante ermitteln, ob bei Downloads andere Dinge notwendig sind oder nicht, ob die Unix-perms stimmen usw. Ich nenne wie immer Lösungen, die bei mir laufen. Also nimm vielleicht mal die Orte die macOS für Logs vorsieht und die sinnigerweise nicht unter speziellen Berechitungen stehen: ~/Library/Logs

Ich weiß auch nicht ob dein "Test" der Aufruf des scriptes im Terminal ist oder via lauchctl. Mach doch mal einen kompletten copy&paste eines Aufrufes in Terminal, so dass man jeden Befehl und jede Ausgabe sehen kann. Nicht via launchctl.
 
der Vollständigkleit wegen:
mein .zshrc
Code:
export HOMEBREW_PREFIX="/opt/homebrew";
export HOMEBREW_CELLAR="/opt/homebrew/Cellar";
export HOMEBREW_REPOSITORY="/opt/homebrew";
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin${PATH+:$PATH}";
export MANPATH="/opt/homebrew/share/man${MANPATH+:$MANPATH}:";
export INFOPATH="/opt/homebrew/share/info:${INFOPATH:-}";
export PATH="$PATH:/Users/jt/Documents/scripts";
export PROMPT='%F{green}%B%d >%b%f ';
 
was ergibt ein "ls -l" für Rechte? Wie ist die Standardshell des Terminals. Die zsh-config-Files hast du aj bereits bestätigt, dass sie passen.
Code:
-rwxr-xr-x@  1 jt  staff   35 13 Jan 16:01 Test1.sh
Alles andere zum Ort für stderr und stdout habe ich oben geschrieben.
Die liegen an gleicher Stelle wie Test1.sh und werden auch angelegt (zumindest bei bash - zsh lädt das script ja erst gar nicht)
Und wie immer: Ich kann leider nicht jede denkbare Variante ermitteln, ob bei Downloads andere Dinge notwendig sind oder nicht, ob die Unix-perms stimmen usw. Ich nenne wie immer Lösung die bei mir laufen. Also nimm vielleicht mal die orte die macOS für Logs vorsieht und die sinnigerweise nciht unter speziellen Berechitungen stehen: ~/Library/Logs
 
... der Pfad sieht seltsam aus. Es fehlt für mich ein Doppelpunkt in der 4. Zeile. Zudem ist das Konstrukt etwas undurchsichtig und ich müsste es erst analysieren, ob das überhaupt sinnvoll ist, zumal in der letzten Zeile nochmals am Pfad gewerkelt wird.

Ad-hoc sieht es für mich so aus, als ob die Standard-Pfade gar nicht enthalten sind. Das mag an dem seltsamen Konstrukt leigen und auch daran, dass ich deine restliche Config (etc/paths.d, /etc/profile, .zprofile ) nicht kenne. Nein poste sie nciht. Ein Ferndiagnose all dieser Files bringt nichts.

Damit du mir glaubst:

das ist einer meiner LaunchAgents

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>de.lisanet.duplicacy</string>
    <key>Program</key>
    <string>/usr/local/bin/duplicacy-bup</string>
    <key>StandardErrorPath</key>
    <string>/Users/simone/Library/Logs/de.lisanet.duplicacy.stderr</string>
    <key>StandardOutPath</key>
    <string>/Users/simone/Library/Logs/de.lisanet.duplicacy.stdout</string>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>18</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
</dict>
</plist>

und das das script mit genügend Shell-Befehlen, von denen lediglich das nicht zu macOS gehörende duplicacy berechtigt ist, sowie Terminal.app.
Code:
#!/bin/zsh

base="/Users/ich"
ssid="lisanet"

#----
device=$(/usr/sbin/networksetup -listallhardwareports | /usr/bin/awk '/Wi-Fi/{getline; print $2}')
air=$(/usr/sbin/networksetup -getairportnetwork $device | /usr/bin/cut -d " " -f4)
if [ "$air" <> "$ssid" ]; then
    echo
    echo -n "network $air not allowed for backup on "
    date
    exit
fi


tag=$(date +%Y-%m-%d)
echo
echo -n "duplicacy backup started : "
date

cd "$base"
/usr/local/bin/duplicacy backup -threads 1 -vss -t "$tag" -stats | grep -v -e "ed chunk" -e "Uploaded"
/usr/local/bin/duplicacy prune -keep 0:360 -keep 30:180 -keep 7:30 -keep 1:3
echo -n "duplicacy backup finished: "
date

Mehr an Hilfe kann ich dir nicht bieten.
 
auch angelegt (zumindest bei bash - zsh lädt das script ja erst gar nicht)

das habe ich doch schon erklärt warum das so ist. Und wenn zsh das script nicht startet ist deine Config nicht korrekt. Ich rede hier vom Aufruf in Terminal.app. Nicht via launchctl.
 
Wenn du mein simples test-script meinst:
Code:
/Users/jt/Downloads > ls -l
total 288
-rw-r--r--@  1 jt  staff  127013 13 Jan 16:34 Bildschirmfoto 2024-01-13 um 16.33.34.jpg
drwxr-xr-x@  8 jt  staff     256 24 Dez 10:01 Fotos_in_Arbeit
drwxr-xr-x@  3 jt  staff      96 21 Dez 16:04 Neue Fotos
drwxr-xr-x@  2 jt  staff      64  5 Dez 12:53 Neue Musik
drwxr-xr-x@  3 jt  staff      96 11 Jan 09:11 Neue Videos
drwxr-xr-x@  3 jt  staff      96  9 Dez 18:29 Neues-Hörspiel-oder-Hörbuch
drwxr-xr-x   6 jt  staff     192 15 Dez 19:49 Raspi
drwxr-xr-x@ 25 jt  staff     800 20 Nov 18:45 Spotify Cache
-rwxr-xr-x@  1 jt  staff      35 13 Jan 16:01 Test1.sh
-rw-r--r--@  1 jt  staff     561 13 Jan 15:24 com.jt.backup.plist
-rw-r--r--@  1 jt  staff     545 13 Jan 15:19 com.jt.test.plist
drwxr-xr-x@  3 jt  staff      96 15 Dez 20:03 mount_omv-shares_ip.app
-rwxr-xr-x@  1 jt  staff     165 23 Dez 20:49 test.sh
drwxr-xr-x@  5 jt  staff     160  7 Jan 22:00 tmp
/Users/jt/Downloads > ./Test1.sh
Dies ist ein Test
/Users/jt/Downloads >
 
ich wiederhole mich schon wieder: änder die ort für stderr und stdout.

Wenn es nicht am Ort liegt, dann ist irgendwas anderes bei dir nicht stimmig, das ich nicht kenne. Sorry. Mehr weiß ich nicht
 
ich wiederhole mich schon wieder: änder die ort für stderr und stdout.
Geändert auf /Users/jt/Library/Logs/de.jt.test.stderr und /Users/jt/Library/Logs/de.jt.test.stdout
Und aus Test1.sh noch Test1 gemacht (ohne .sh)

Und auch ich muss mich leider wiederholen: die Dateien werden angelegt und in /Users/jt/Library/Logs/de.jt.test.stderr wird alle 60s eingetragen:
/bin/zsh: can't open input file: /Users/jt/Downloads/Test1
Alles wie gehabt - am Pfad selbst liegt es nicht
Was mich so irritiert ist: das "can't open"


Wenn es nicht am Ort liegt, dann ist irgendwas anderes bei dir nicht stimmig, das ich nicht kenne. Sorry. Mehr weiß ich nicht
tja, wenn du schon nicht mehr weißt ...

Nebenbei - wegen des Terminals und zsh:
Bildschirmfoto 2024-01-13 um 16.33.34.jpg
 
Code:
-rwxr-xr-x@ 1 jt staff 165 23 Dez 20:49 test.sh
Ich würde fast wetten, dass dein test.sh mit dem com.apple.macl Attribute "verseucht" sind. Kann man schon aus dem @ vermuten und mit ls -l@ definitiv sagen.

com.apple.macl ist das dubioseste von allen kaum dokumentierten Apple-Attributen und ruft m.W. Gatekeeper und alle möglichen "Schutz"-Mechanismen auf den Plan:

https://eclecticlight.co/2022/09/28/where-to-find-gatekeeper/
Gatekeeper:
  • verifies the software has been signed by an identified developer, and notarised by Apple, and hasn’t been altered;
  • asks the user to approve opening downloaded software the first time, even if it is notarised;
  • opens apps from randomised, read-only locations “when necessary” to protect against the distribution of malicious plug-ins with benign apps.
(Anderes Stichwort: App-Translocation)

Somit wäre z.B. gar nicht sicher, dass dein Skript überhaupt im Download-Ordner gestartet wird.
Darauf deutet auch das "can't open ..." hin.

Wie schon mal angeregt, würde ich vorschlagen, jetzt auch das Shell-Skript -ohne das com.apple.macl - nochmal an anderem Ort neu anzulegen und von da aus zu testen.
 
wahrscheinlich bin ich schon zu lange mit IT unterwegs und denke in zu eingefahrene Bahnen. Bei mir liegen alle scripte immer im Pfad und zwar einem der eine Filesystem-Standard entspricht, also bspw. /usr/local/bin. Ich käme nie auf die Idee, auch nicht zum Testen, das in Downloads zu legen, da ich die Rechte dieser Ordner kenne.

Vielleicht liegt es ja auch an was ganz banalem, wie einem Tippfehler oder sonst was. ich habe (und werde) dein script nicht analysiert. Es ist für mich ehrlich gesagt auch nicht wichtig warum es nciht läuft, sondern wie es gestaltet werden muss, dass es läuft. Und da habe ich dir alles genannt.

Nur noch eins: deine plist liegt schon im dazu gehörenden Verzeichnis und hat die korrekten Rechte und du "entlädst" und "lädst" es jedesmal wieder, wenn du was am script / Pfaden / whatever geändert hast?

Also: weiterhin viel Glück.
 
tja, ich kann es nicht sagen. Ich habe nun das script an verschiedenen Stellen abgelegt u.a sogar in /usr/local/bin (wie lisanet)
Immer dasselbe. Manchmal lädt es sogar gar nicht über launchctl.
Per Termoinal lässt es sich immer ausführen
Ich glaube, ich mache jetzt erst mal Fußball-und-Bier-Auszeit
 
wahrscheinlich bin ich schon zu lange mit IT unterwegs und denke in zu eingefahrene Bahnen. Bei mir liegen alle scripte immer im Pfad und zwar einem der eine Filesystem-Standard entspricht, also bspw. /usr/local/bin. Ich käme nie auf die Idee, auch nicht zum Testen, das in Downloads zu legen, da ich die Rechte dieser Ordner kenne.

Vielleicht liegt es ja auch an was ganz banalem, wie einem Tippfehler oder sonst was. ich habe (und werde) dein script nicht analysiert. Es ist für mich ehrlich gesagt auch nicht wichtig warum es nciht läuft, sondern wie es gestaltet werden muss, dass es läuft. Und da habe ich dir alles genannt.

Nur noch eins: deine plist liegt schon im dazu gehörenden Verzeichnis und hat die korrekten Rechte und du "entlädst" und "lädst" es jedesmal wieder, wenn du was am script / Pfaden / whatever geändert hast?

Also: weiterhin viel Glück.
Danke. Wie dem auch sei
Aber Tippfehler schließe ich aus, da es ja mit bash und bash-Vollfreigabe einwandfrei läuft.
Auch das .plist file funzt ja.
Und an "Hello World" lässt sich ja nix analysieren.
 
Letzter Tipp in diesem Thread:

Nutze die App LaunchControl, di sorgt dafür das du richtig mit lauchctl umgehst, bspw lauchctl load ist veraltet.
 
Danke. Wie dem auch sei
Aber Tippfehler schließe ich aus, da es ja mit bash und bash-Vollfreigabe einwandfrei läuft.
Auch das .plist file funzt ja.
Und an "Hello World" lässt sich ja nix analysieren.
an deiner plist, an deiner Bedienung, an deinem System habe und werde ich nichts analysieren. Wie stellst du überhaupt fest, dass die plist läuft. Es funktioniert ja eben genau nicht. Aber das war es jetzt endgültig. Viel Glück.
 
an deiner plist, an deiner Bedienung, an deinem System habe und werde ich nichts analysieren. Wie stellst du überhaupt fest, dass die plist läuft. Es funktioniert ja eben genau nicht. Aber das war es jetzt endgültig. Viel Glück.
Wie stelle ich das fest? Ganz einfach:
wie im .plist eingestellt wird alle 60s das script ausgeführt und die Ausgabe in das output file geschrieben.
Habe ich doch schon 10 mal geschrieben?!

Einzige Voraussetzung: ich nehme bash und habe bash für Vollzugriff freigeschaltet. zsh geht ums verrecken nicht.

Aber nun ists gut. Besten Dank für deine Mühe.
 
Nur zur Info: es läuft nun.
Lösung:
- ich habe ein neues Verzeichnis "/Users/jt/bin" angelegt,
- dort das Script rein (nun mit #!/bin/zsh),
- die .plist eben mit dem neuen Script-Pfad angepasst und neu geladen,
- und stderr/stdout so belassen (/Users/jt/Downloads/) (das ist halt mein tägliches Standardverzeichnis, das ich immer sehe)

Löppt. Auch bereits mein tägliches backup-rsync-script.

Das Verzeichnis für das script war der Schlüssel (obwohl ich /usr/local/bin auch ausprobiert hatte - was adhoc nicht ging)
Also eigentlich alles ganz einfach :LOL: - @MrChad hatte in #3 schon geschrieben: "Verschiebe / kopiere alles in einen "harmloseren" Ordner"

Die LaunchControl app habe ich mal als Trial runtergeladen. Sieht gut aus und war mir zumindest eine Hilfe bei der Übersicht, laden/entladen des Agenten und dem testweisen Starten des scripts über den Dienst.
 
Zuletzt bearbeitet:
Zurück
Oben Unten