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>