Warum wird mein launchd-Skript bei der Anmeldung nicht ausgeführt?

Ich habe versucht, dieser Frage nachzugehen , damit beim Login der aktuell konfigurierte Bildschirmschoner zum Desktop-Hintergrund wird. Daher habe ich folgendes Skript erstellt:

# login.sh
/System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine -background &

~/Library/LaunchAgents/my_login_items.plistIch habe dann wie bei den Inhalten einen Startdienst erstellt

<?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>com.user.loginscript</string>
   <key>Program</key>
   <string>/path/to/login.sh</string>
   <key>RunAtLoad</key>
   <true/>
</dict>
</plist>

Und dann laufen launchctl load ~/Library/LaunchAgents/my_login_items.plist. Es passiert jedoch nichts.

Funktioniert login.shes, wenn Sie es von der Befehlszeile aus ausführen? (Ich gehe davon aus, dass dies der Fall ist, wollte es aber überprüfen). Wann launchctl loadfunktioniert es? (Auch hier gehe ich davon aus, dass dies nicht der Fall ist, muss aber überprüft werden). Abschließend, und dies verirrt sich in den Bereich "Antwort", könnten Sie versuchen, StandardOutPathund StandardErrorPathzu Ihrem hinzuzufügen plist, damit der Agent protokolliert, was passiert? ( <key>StandardOutPath</key> <string>/tmp/test.stdout</string> <key>StandardErrorPath</key> <string>/tmp/test.stderr</string>)
@JohnN Beide Annahmen sind richtig. Ich habe die Pfadschlüssel hinzugefügt, aber beide Protokolldateien bleiben leer.
Ach, das ist enttäuschend. Ich werde ein Spiel herumspielen und sehen, ob ich das replizieren kann.

Antworten (1)

Dies ist eine zutiefst unbefriedigende Antwort, aber ich habe sie zum Laufen gebracht, indem ich /System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine -background &eine Subshell ausgeführt habe. Ich wechselte login.shzu ...

#!/bin/bash
longname=$0
shortname=$(basename "${longname}")
echo "$(date -u "+%Y-%m-%d %H:%M:%S") ${shortname} (${longname}) running..."
output=$(/System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine -background)    # <- COMMAND GOES HERE            
echo "$(date -u "+%Y-%m-%d %H:%M:%S") ${shortname} ended."

... und das funktioniert (mein üblicher statischer Desktop wechselt zu meinem Standard-Bildschirmschoner). Ich verwende dieses Idiom für andere launchd-Tasks und führe die Tasks in einer Subshell aus, damit ich leicht testen kann, ob die Operation erfolgreich war, und protokollieren kann $output. Ich verstehe nicht, warum das funktioniert, während Ihr Original nicht funktioniert, aber zumindest funktioniert es.

Beachten Sie, dass ich das &am Ende Ihres Befehls entfernt habe - ich bin nicht überzeugt, dass dies mit notwendig ist launchd, und es hat mein Wrapper-Skript daran gehindert, zu protokollieren, dass es beendet wurde (obwohl dies &nicht die Ursache des ursprünglichen Problems war).