Beruflich muss ich Citrix benutzen um an die interne Infrastruktur zu kommen und meinen Dienst zu verrichten. Soweit ist das auch ok, nur wenn das macBook den Bildschirm ausschaltet, wird auch automatisch die Verbindung getrennt und ich muss mich wieder anmelden. Nicht nur das ist nervig, sondern auch der Umstand, dass der erneute Login manchmal nicht funktioniert, da meine VM die ich dann nutze (oder genutzt habe) eingefroren ist und somit nicht mehr ansprechbar war. Ein deaktivieren der Energieeinstellung hilft zwar, also dass das macBook nicht mehr schlafen geht. Aber da es auch mein privat genutztes Gerät ist, nervt es, wenn bspw. das angeschlossene Display etc. nicht mehr ausgeschaltet wird.
Mein derzeitiger Ansatz ist daher die automatisierte Nutzung von caffinate. Dabei wird das folgende Skript im Hintergrund ausgeführt und prüft, ob aktuell eine Citrix-Verbindung besteht. Wenn ja, wird der Schlafmodus deaktiviert indem caffinate gestartet wird. Besteht keine Citrix-Verbindung oder wurde diese in der Zwischenzeit beendet, wird der Schlafmodus wieder deaktiviert indem der caffinate-Prozess beendet wird.
#!/usr/bin/env bash
# Log-Datei für Debugging
LOG_FILE="/tmp/citrix_energy.log"
exec >> "$LOG_FILE" 2>&1
# Funktion: Schlafmodus deaktivieren
disable_sleep() {
echo "$(date) | Deaktiviere Schlafmodus (Citrix läuft)" >> "$LOG_FILE"
caffeinate -dims &
CAFFEINATE_PID=$!
echo "Caffeinate PID: $CAFFEINATE_PID" >> "$LOG_FILE"
}
# Funktion: Schlafmodus wieder aktivieren
enable_sleep() {
echo "$(date) | Aktiviere Schlafmodus (Citrix beendet)" >> "$LOG_FILE"
if kill "$CAFFEINATE_PID" 2>/dev/null; then
echo "Caffeinate ($CAFFEINATE_PID) beendet" >> "$LOG_FILE"
else
echo "Fehler: Caffeinate-Prozess nicht gefunden" >> "$LOG_FILE"
fi
}
# Hauptschleife
LAST_STATE=false
while true; do
# Prüfe, ob Citrix Viewer läuft
if pgrep -xq 'Citrix Viewer'; then
CURRENT_STATE=true
if [ "$LAST_STATE" = false ]; then
disable_sleep
fi
else
CURRENT_STATE=false
if [ "$LAST_STATE" = true ]; then
enable_sleep
fi
fi
LAST_STATE=$CURRENT_STATE
sleep 10 # Prüfe alle 10 Sekunden
done
Zusätzlich, wenn man das Ganze automatisch im Hintergrund starten möchte, müssten wir noch ein Iten für den LaunchAgent unter ~/Library/LaunchAgents/com.user.citrixenergy.plist einrichten.
<?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.user.citrixenergy</string>
<key>ProgramArguments</key>
<array>
<string>/Users/user/bin/citrix_energymanager.sh</string>
</array>
<key>RunAtLoad</key>
<true/> <!-- Startet beim Login -->
<key>KeepAlive</key>
<true/> <!-- Startet neu, falls das Skript crasht -->
<key>StandardOutPath</key>
<string>/tmp/citrix_energy.log</string>
<key>StandardErrorPath</key>
<string>/tmp/citrix_energy_error.log</string>
</dict>
</plist>