Lassen Sie ein Skript/eine Anwendung beim Abmelden ausführen

Wir alle wissen, dass Mac OS X über die sehr nützliche Funktion „ Anmeldeobjekte “ verfügt , mit der Sie unter anderem Apps/Skripts einrichten können, die ausgeführt werden, wenn Sie sich anmelden.

Ich suche nach einer Möglichkeit, eine Liste von Skripten/Apps einzurichten, die ausgeführt werden, wenn ich mich abmelde . Eine "Logout Items"-Liste, wenn Sie so wollen.
Grundsätzlich möchte ich ein paar kleine Bereinigungsskripte für mich selbst schreiben, die automatisch ausgeführt werden, wenn ich mich abmelde oder herunterfahre.

Ich suche also nach einer Möglichkeit, ein Skript (oder idealerweise eine Liste davon) automatisch auszulösen, wenn ich mich abmelde. Die Abmeldung würde warten, bis die Skripts abgeschlossen sind (genauso wie die Abmeldung darauf wartet, dass Sie auf Speichern klicken, wenn eine App dies anfordert).

Gibt es eine Möglichkeit, (ein) Skript(e) automatisch auszulösen, wenn ich mich von Mac OS X abmelde?

Antworten (5)

Logout-Hooks waren in 10.4 veraltet , aber sie funktionieren immer noch ab 10.9.

sudo defaults write com.apple.loginwindow LogoutHook ~/.logouthook
echo $'#!/bin/bash\nsay a' > ~/.logouthook
chmod +x ~/.logouthook

Der Wert des LogoutHook-Schlüssels kann nur ein Pfad zu einer ausführbaren Datei und kein Shell-Befehl sein. Der Logout-Hook wird als root ausgeführt.

Der Standardbefehl ändert /var/root/Library/Preferences/com.apple.loginwindow.plist. Das Hinzufügen eines LogoutHook-Schlüssels zu /Library/Preferences/com.apple.loginwindow.plist funktioniert nicht.

Wenn die Ausführung eines Logout-Hooks lange genug dauert, wird ein grauer Bildschirm angezeigt, bis der Logout-Hook beendet wird. Es scheint kein Zeitlimit zu geben, nach dem Logout-Hooks beendet werden müssen.

Ich habe keine Möglichkeit gefunden, Programme beim Abmelden zuverlässig mit launchd auszuführen. Als ich versuchte, Signale wie EXIT abzufangen, wurde der Code im Trap nur ausgeführt, wenn ich mich vom Anmeldefenster abmeldete, und nicht, wenn ich herunterfuhr oder neu startete.

<?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>test</string>
  <key>ProgramArguments</key>
  <array>
    <string>bash</string>
    <string>-c</string>
    <string>trap 'echo a>/Users/username/Desktop/a;say a' EXIT;while :;do sleep 10;done</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>
Hmm, bei mir hat beides nicht funktioniert. Ich habe dieses Skript , das funktioniert, wenn ich es mit ausführe sh(es erstellt diese .txt-Datei). Ich habe das Skript als /etc/rc.shutdown.local gespeichert und es mit hinzugefügt, defaultswie Sie sagten. Keine der Dateien war bereits vorhanden. Mache ich etwas falsch? Vielen Dank!
Ich bin mir nicht sicher, ob ich etwas falsch mache oder nicht. Ich verwende 10.6.8 und LogoutHook funktioniert nicht. Ich würde mich freuen, wenn Sie sich diesen Screenshot ansehen und mich wissen lassen könnten, wenn etwas nicht stimmt. Vielen Dank!
Ah! Der letzte hat es am 10.6.8 geschafft. Vielen Dank! Eine Anmerkung: Es funktioniert nicht mit Lion :(
Beide Methoden funktionieren auf meinem Mountain Lion (10.8.2)-Rechner einwandfrei, selbst beim Herunterfahren oder Neustarten. Beachten Sie, dass die LoginHook/LogoutHook-Hooks im Kontext des Root- Benutzers ausgeführt werden und dass es sich um einzelne, systemweite Hooks handelt und dass der Login-Hook synchron ausgeführt wird – viel früher als Pro-Benutzer-Startagenten; In ähnlicher Weise wird der Logout-Hook früher ausgeführt als ein Pro-Benutzer-Startagent, der die EXIT-Trap-Methode verwendet. Es gibt Fälle, in denen nur die Haken funktionieren; Wenn Sie beispielsweise den Ton beim Herunterfahren stumm schalten möchten, um den Startton des Mac zu unterdrücken, funktioniert nur der LogoutHook zuverlässig.

Tatsächlich gibt es einen nicht veralteten Weg, dies zu tun:

  1. Öffnen Sie die App „Skript-Editor“.
  2. Paste
    do shell script "PUT YOUR START SCRIPT PATH HERE"
    
    on quit
        do shell script "PUT YOUR STOP SCRIPT PATH HERE"
        continue quit
    end quit
  1. Datei > Speichern, Anwendung auswählen und nach Laufhandler geöffnet bleiben und Speichern
  2. Systemeinstellungen > Benutzer & Gruppen > Registerkarte Anmeldeobjekte > Schaltfläche +
  3. Fügen Sie die Anwendung hinzu und markieren Sie sie als Ausgeblendet

Um es im Dock auszublenden:

  1. Klicken Sie mit der rechten Maustaste auf die Anwendung und wählen Sie Paketinhalt anzeigen aus
  2. Öffnen Sie Info.plist und fügen Sie hinzu
<key>NSUIElement</key>
<string>1</string>
Ich liebe das. Einfach und für meine Bedürfnisse ausreichend. Und nicht verworfen.

Script Timer ist dafür eine gute Wahl. Es kann beim Abmelden, Anmelden und vielem mehr ausgeführt werden. Ich würde mit dieser für eine einfache und benutzerfreundliche Lösung gehen. Es hat eine einfache GUI:

Ausgelöste Aktion

Es gibt zwei Dinge, die Sie beim Skript-Timer beachten müssen. Erstens ist es nicht kostenlos. Es kostet $ 12, aber ich persönlich denke, es ist es wert. Zweitens ist es nicht vollständig mit Lion kompatibel, aber sie haben ein kostenloses Update versprochen, sobald sie es kompatibel gemacht haben.

Dies ist jetzt veraltet

Sie könnten auch eine Mac-Anwendung aus Ihrem Skript erstellen, indem Sie so etwas wie Platypus verwenden und sie dann wie jede andere Anwendung zu Anmeldeobjekten hinzufügen.

Power Manager kann ein Skript ausführen, wenn sich ein Benutzer abmeldet. Dies ist ein kommerzielles Produkt und unterstützt das neueste macOS.

Power Manager führt ein Skript zum Abmelden des Zeitplan-Assistenten aus

Frühere Versionen erforderten die Verwendung des Ereigniseditors , aber jetzt ist eine Aufgabe des Planungsassistenten zum Ausführen von Skripts beim An- und Abmelden enthalten.

Ich habe Power Manager geschrieben, also zögern Sie nicht, technische Fragen zu seiner Implementierung zu stellen. Im Fall von durch Abmelden ausgelösten Ereignissen fragt Power Manager keine Änderungen im Benutzerstatus ab, sondern wird stattdessen von macOS über Benutzeränderungen benachrichtigt. Dieser Ansatz ist effizienter als eine Skriptschleife/-abfrage.