Erstellen Sie ein Skript / eine App, die beim Abmelden ausgeführt wird

13

Wir alle wissen, dass Mac OS X über die sehr nützliche Funktion zum Anmelden von Elementen verfügt , mit der Sie unter anderem Apps / Skripte einrichten können, die beim Anmelden ausgeführt werden.

Ich suche nach einer Möglichkeit, eine Liste der Skripts / Apps einzurichten, die beim Abmelden ausgeführt werden . Eine Liste "Logout Items", 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.

Daher suche ich nach einer Möglichkeit, ein Skript (oder im Idealfall eine Liste davon) beim Abmelden automatisch auszulösen. Das Abmelden würde warten, bis die Skripte beendet sind (genau wie das Abmelden darauf wartet, dass Sie auf Speichern klicken, wenn eine App dies anfordert).

Gibt es eine Möglichkeit, Skripte automatisch auszulösen, wenn ich mich von Mac OS X abmelde?

Nathan Greenstein
quelle

Antworten:

7

Abmelde-Hooks waren in 10.4 veraltet , funktionieren aber 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 Befehl defaults ä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 Abmelde-Hooks lange genug dauert, wird ein grauer Bildschirm angezeigt, bis der Abmelde-Hook beendet wird. Es scheint keine zeitliche Begrenzung zu geben, nach der Abmelde-Hooks zum Beenden gezwungen werden.

Ich habe nicht herausgefunden, wie ich Programme beim Abmelden zuverlässig mit launchd ausführen kann. Als ich versuchte, Signale wie EXIT abzufangen, wurde der Code in der Falle nur ausgeführt, wenn ich mich beim Anmeldefenster abgemeldet hatte 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>
Lri
quelle
Hmm, keiner von denen hat für mich gearbeitet. Ich habe dieses Skript , das funktioniert, wenn ich es mit sh(es erstellt die TXT-Datei). Ich habe das Skript als /etc/rc.shutdown.local gespeichert und es defaultswie gesagt mit hinzugefügt . Keine der beiden Dateien war bereits vorhanden. Mache ich etwas falsch? Vielen Dank!
Nathan Greenstein
Ich bin mir nicht sicher, ob ich etwas falsch mache oder nicht. Ich bin auf 10.6.8 und LogoutHook funktioniert nicht. Ich würde mich freuen, wenn Sie sich diesen Screenshot ansehen und mich informieren könnten , wenn etwas nicht stimmt. Vielen Dank!
Nathan Greenstein
1
Ah! Dieser letzte hat den Trick am 10.6.8 gemacht. Vielen Dank! Ein Hinweis: es funktioniert nicht mit Lion :(
Nathan Greenstein
2
Beide Methoden funktionieren auf meinem Mountain Lion-Computer (10.8.2) einwandfrei, selbst wenn er heruntergefahren oder neu gestartet wird. Beachten Sie, dass die LoginHook- / LogoutHook-Hooks im Kontext des Root- Benutzers ausgeführt werden, dass es sich um einzelne, systemweite Hooks handelt und dass der Login-Hook synchron ausgeführt wird - viel früher als die benutzerspezifischen Startagenten. In ähnlicher Weise wird der Abmelde-Hook früher ausgeführt als ein benutzerspezifischer Startagent, der die EXIT-Trap-Methode verwendet. Es gibt Fälle, in denen nur die Haken funktionieren. Wenn Sie beispielsweise den Ton beim Herunterfahren stummschalten möchten, um den Startton des Mac zu unterdrücken, funktioniert nur der LogoutHook zuverlässig.
mklement0
1

Eigentlich gibt es einen Weg:

  1. Öffnen Sie die App "Script Editor"
  2. Einfügen

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, Select Anwendung und offen bleiben nach run - Handler und Speichern
  2. Systemeinstellungen> Benutzer und Gruppen> Registerkarte "Anmeldeobjekte"> Schaltfläche "+"
  3. Fügen Sie die Anwendung hinzu und markieren Sie sie als ausgeblendet

So verstecken Sie es im Dock:

  1. Klicken Sie mit der rechten Maustaste auf die Anwendung und wählen Sie Paketinhalt anzeigen
  2. Öffnen Sie Info.plist und fügen Sie hinzu

<key>NSUIElement</key>
<string>1</string>
Filippo
quelle
Lieben Sie dieses. Einfach und angemessen für meine Bedürfnisse. Und nicht veraltet.
Ivan X
0

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

Ausgelöste Aktion

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

Daviesgeek
quelle
1
Dies ist jetzt veraltet
Kirtikumar A.
0

Sie können aus Ihrem Skript auch eine Mac-Anwendung mit Platypus erstellen und diese dann wie jede andere Anwendung zu den Anmeldeobjekten hinzufügen.

svth
quelle
0

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 beim Abmelden ein Skript für den Schedule Assistant-Task aus

Frühere Versionen mit dem Ereigniseditor erforderlich , aber ein Schedule Assistant-Task ist jetzt zum Ausführen von Skripten beim An- und Abmelden enthalten.

Ich habe Power Manager geschrieben, daher können Sie technische Fragen zur Implementierung stellen. Im Fall von Ereignissen, die durch das Abmelden ausgelöst wurden, fragt Power Manager keine Änderungen des Benutzerstatus ab, sondern wird von macOS über Benutzeränderungen benachrichtigt. Dieser Ansatz ist effizienter als eine Skriptschleife / -abfrage.

Graham Miln
quelle