Führen Sie das Skript beim Abmelden ohne Verwendung des Abmelde-Hooks aus

11

Ich habe versucht, einige Bereinigungsbefehle auszuführen, wenn sich ein Benutzer abmeldet. Die alte Funktion zum Abmelden von Hooks ist zwar noch funktionsfähig, aber seit einiger Zeit veraltet, sodass sie möglicherweise nicht mehr lange bei uns ist.

Obwohl es launchdeine bequeme Alternative zu Login-Hooks bietet, gibt es leider keinen so offensichtlichen Ersatz für Logout-Hooks.

Ich habe bereits mit dem Erstellen eines Shell-Skripts experimentiert, das beim Anmelden gestartet wird und einfach in den Ruhezustand wechselt, bis ein Kill-Signal empfangen wird. Dies scheint jedoch nicht zu funktionieren (das Skript empfängt das Signal während des normalen Betriebs nie).

Ansonsten bin ich mir nicht sicher, wie ich einen schnellen Befehl zum Abmelden am besten ausführen kann. Ich weiß, dass es einige Dienstprogramme von Drittanbietern gibt, die dies tun können, aber gibt es noch einen "richtigen" Weg, dies zu tun?

Haravikk
quelle

Antworten:

7

Es scheint, dass Apple nicht an einem Logout-Hook-Ersatz interessiert ist, da sie mein Problem geschlossen haben und nach einem gefragt haben.

Eine der Verbesserungen in Yosemite ist jedoch, dass launchd jetzt ordnungsgemäß Signale an Shell-Skripte sendet. Dies bedeutet, dass Sie jetzt eine Abmeldeaufgabe wie folgt ausführen können:

Hier ist ein Beispiel logout.sh:

#!/bin/sh
onLogout() {
    echo 'Logging out' >> ~/Logs/logout.sh.log
    exit
}

trap 'onLogout' SIGINT SIGHUP SIGTERM
while true; do
    sleep 86400 &
    wait $!
done

Dies wird einfach in den Ruhezustand versetzt (asynchron, synchron ohne kaufmännisches Und scheint nicht zu funktionieren), bis eines der eingeschlossenen Signale empfangen wird. An diesem Punkt wird die onLogoutFunktion ausgeführt.

Alles, was Sie tun müssen, ist, dieses Skript mit einem RunAtLoadStartagenten oder einem Startdämon zu starten. Es wird beim Abmelden oder Herunterfahren ausgeführt. Beachten Sie jedoch, dass Aufgaben nur eine begrenzte Zeit haben, bevor sie beendet werden Daher sollte dies nicht verwendet werden, um etwas auszuführen, das lange dauert oder eine Netzwerkverbindung erfordert, die sich verzögern kann usw.

Natürlich nützt dies niemandem auf Mavericks oder früher, aber unter Yosemite scheint dies nun wie erwartet zu funktionieren. Also habe ich es an erster Stelle launchdrichtig gemacht und die Signale einfach nicht richtig gesendet :)

HINWEIS: Damit dies funktioniert, müssen die Shell-Skripte anscheinend direkt beim Start ausgeführt werden, dh sie sollten nicht über aufgerufen werden sh. Wenn es also in ~/Library/Scripts/foo.shIhr Programm eingefügt würde, könnten Argumente wie folgt aussehen:

<key>ProgramArguments</key>
<array>
    <string>~/Library/Scripts/foo.sh</string>
    <string>bar</string>
</array>
<key>EnableGlobbing</key>
<true/>
Haravikk
quelle
Wenn ich dieses Skript ausführe, kehrt es zurück line 8: syntax error near unexpected token ;'(mit einem Grab vor dem Semikolon)
Jason
Hoppla, Sie haben Recht, @Jason. Ich glaube, ich habe es zu stark vereinfacht. Ich habe es so angepasst, dass es einem funktionierenden Beispiel ähnlicher wird.
Haravikk
Es wird ausgelöst, wenn ich es mit launchctl entlade, aber nicht, wenn ich mich abmelde oder neu starte. Warum?
Spalier
Gibt es eine Möglichkeit, es auszuführen, bevor das Netzwerk ausfällt?
Filippo
2

Sie können iHook verwenden, um Login- / Logout-Hooks auszuführen, die nach wie vor für nicht interaktive Login- und Logout-Hooks funktionieren, die in Bash und Python auf Yosemite geschrieben wurden.

http://rsug.itd.umich.edu/software/ihook/


quelle
Leider verwendet dieser immer noch normale Abmeldehaken unter der Haube.
0942v8653
0

Wenn andere, die von Suchmaschinen hierher kommen, keinen Logout-Hook verwenden möchten, führen Sie beispielsweise Folgendes aus:

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

Wird ~/.logouthookdann ausgeführt, wenn Sie sich das nächste Mal abmelden.

Der Wert des LogoutHookSchlüssels muss ein Pfad zu einer ausführbaren Datei und kein Shell-Befehl sein. Der defaultsBefehl wird geändert /var/root/Library/Preferences/com.apple.loginwindow.plist.

Lri
quelle
Vielen Dank, dass Sie es trotzdem als Alternative angegeben haben. Ich befürchte jedoch, dass die Anmelde- und Abmelde-Hooks für die letzten Versionen von OS X veraltet sind. Obwohl ich davon ausgehe, dass sie in Yosemite weiterhin funktionieren (da sie sich hauptsächlich auf die Änderungen der Benutzeroberfläche und der Kontinuität konzentrieren), scheint es, als könnte es jederzeit gehen, wie wenn die alten Startelemente ersetzt werden launchd, nur schade, dass es keine RunBeforeUnloadoder eine ähnliche Option gibt .
Haravikk
0

Ich kann das Start-Abmeldeelement auch nicht in 10.10.1 zum Laufen bringen, aber der LogoutHook-Schlüssel in der "com.apple.loginwindow.plist" von root funktioniert gut. Gibt es noch andere Beispiele für die launchd-Methode?

Wie auch immer, ich habe ein AppleScript geschrieben, um das Systemvolumen beim Abmelden zu beenden, damit das Startsignal beim nächsten Start nicht zu hören ist. Was ich nicht ausgearbeitet habe, sind die Details zum Verwalten mehrerer Abmeldebefehle basierend auf einem einzelnen LogoutHook-Schlüssel oder ob es möglich ist, mehrere LogoutHook-Schlüssel zu speichern. Daher bin ich immer noch an der Launchd-Methode interessiert, die mit Lingon verwaltet werden kann. oder sogar Lingon 3, das einen viel engeren Umfang als das Original hat (vermutlich im App Store vorhanden).

setze current_Vol auf (mache das Shell-Skript "osascript -e \" Ausgabevolumen von (Lautstärkeeinstellungen abrufen) "")
Wenn die zurückgegebene Schaltfläche (Anzeigedialog "Möchten Sie das Startsignal stummschalten, wiederherstellen oder abbrechen?"
    Führen Sie das Shell-Skript "mkdir -p / usr / local / logouttask; echo '#! / bin / bash aus
# Abmeldeskript
osascript -e \ "set volume 0 \" '> / usr / local / logouttask / logoutscript; sudo-Standardeinstellungen schreiben com.apple.loginwindow LogoutHook / usr / local / logouttask / logoutscript; chmod + x / usr / local / logouttask / logoutscript "mit Administratorrechten
sonst
    Versuchen
        Führen Sie das Shell-Skript "sudo defaults write com.apple.loginwindow LogoutHook ''; rm / usr / local / logouttask / logoutscript" mit Administratorrechten aus
        Anzeigedialog "Das Startsignal ist zu hören, wenn die Lautstärkeeinstellung beim Herunterfahren oder Neustart größer als 0 ist." Tasten {"OK"} Standardtaste 1
    Bei Fehler die Fehlernachrichtennummer die Fehlernummer
        Wenn error_number 1 ist, dann
            Anzeigedialog "Das Skript, das die Systemlautstärke beim Abmelden auf Null setzt, ist nicht vorhanden. Das Startsignal ist zu hören, wenn die Lautstärkeeinstellung beim Herunterfahren oder Neustart größer als 0 ist." Tasten {"OK"} Standardtaste 1
        sonst
            Anzeigedialog "Fehler:" & die Fehlernummer & "." & die Schaltflächen für die Fehlermeldung {"OK"} Standardschaltfläche 1
        ende wenn
    Ende versuchen
ende wenn
Gitter
quelle
Wie rufen Sie das Abmeldeelement auf? Mein Beispiel-Shell-Skript für muss direkt aufgerufen werden (keine Verwendung von sh), daher muss es sich um eine ausführbare Datei handeln. Dies werde ich in meiner Antwort vermerken.
Haravikk
Vielen Dank für die Aktualisierung. Ich werde es so schnell wie möglich versuchen und dich wissen lassen.
Trellis
Ich kann das in foo.sh enthaltene Ereignis nur auslösen, indem ich "launchctl unload" auf der Liste ausführe, die es im Terminal aufruft. Das Abmelden löst es nicht aus.
Trellis