Faire exécuter un script / une application à la déconnexion

13

Nous savons tous que Mac OS X possède la fonctionnalité très utile des éléments de connexion qui vous permet, entre autres, de configurer des applications / scripts à exécuter lorsque vous vous connectez.

Je cherche un moyen de configurer une liste de scripts / applications qui s'exécutent lorsque je me déconnecte . Une liste «Éléments de déconnexion», si vous voulez.
Fondamentalement, je veux écrire pour moi quelques petits scripts de nettoyage qui s'exécuteront automatiquement lorsque je me déconnecte ou que je m'arrête.

Donc, je cherche un moyen de déclencher automatiquement un script (ou, idéalement, une liste d'entre eux) lorsque je me déconnecte. La déconnexion attendrait la fin des scripts (tout comme la déconnexion attend que vous cliquiez sur Enregistrer si une application le demande).

Existe-t-il un moyen de déclencher automatiquement un ou plusieurs scripts lorsque je me déconnecte de Mac OS X?

Nathan Greenstein
la source

Réponses:

7

Les hooks de déconnexion ont été dépréciés en 10.4 , mais ils fonctionnent toujours à partir de 10.9.

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

La valeur de la clé LogoutHook ne peut être qu'un chemin d'accès à un exécutable et non une commande shell. Le hook de déconnexion est exécuté en tant que root.

La commande par défaut modifie /var/root/Library/Preferences/com.apple.loginwindow.plist. L'ajout d'une clé LogoutHook à /Library/Preferences/com.apple.loginwindow.plist ne fonctionne pas.

Si un hook de déconnexion prend suffisamment de temps pour s'exécuter, un écran gris s'affiche jusqu'à ce que le hook de déconnexion se termine. Il ne semble pas y avoir de limite de temps après laquelle les hooks de déconnexion sont forcés de se terminer.

Je n'ai pas trouvé de moyen d'exécuter des programmes de déconnexion de manière fiable avec launchd. Lorsque j'ai essayé d'intercepter des signaux comme EXIT, le code dans l'interruption n'a été exécuté que lorsque je me suis déconnecté de la fenêtre de connexion et non lorsque j'ai arrêté ou redémarré.

<?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
la source
Hmm, ni l'un ni l'autre n'a fonctionné pour moi. J'ai ce script , qui fonctionne si je l'exécute avec sh(il crée ce fichier .txt). J'ai enregistré le script sous /etc/rc.shutdown.local, et je l'ai ajouté avec defaultscomme vous l'avez dit. Aucun de ces fichiers n'était déjà là. Est-ce que je fais quelque chose de mal? Merci!
Nathan Greenstein
Je ne sais pas si je fais quelque chose de mal ou non. Je suis sur 10.6.8 et LogoutHook ne fonctionne pas. J'apprécierais si vous pouviez regarder cette capture d'écran et me faire savoir si quelque chose ne va pas. Merci!
Nathan Greenstein
1
Ah! Ce dernier a fait l'affaire en 10.6.8. Merci! Une remarque cependant: cela ne fonctionne pas avec Lion :(
Nathan Greenstein
2
Les deux méthodes fonctionnent bien sur ma machine Mountain Lion (10.8.2), même lors de l'arrêt ou du redémarrage. Notez que les hooks LoginHook / LogoutHook s'exécutent dans le contexte de l' utilisateur root , et qu'ils sont des hooks uniques à l'échelle du système , et que le hook de connexion s'exécute de manière synchrone - beaucoup plus tôt que les agents de lancement par utilisateur; de même, le hook de déconnexion s'exécute plus tôt qu'un agent de lancement par utilisateur qui utilise la méthode EXIT-trap. Il y a des cas où seuls les crochets fonctionnent; par exemple, si vous souhaitez couper le son à l'arrêt afin de supprimer le son de démarrage du Mac, seul le LogoutHook fonctionne de manière fiable.
mklement0
1

En fait, il existe un moyen:

  1. Ouvrez l'application "Script Editor"
  2. Pâte

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. Fichier> Enregistrer, sélectionner l' application et rester ouvert après l'exécution du gestionnaire et enregistrer
  2. Préférences système> Utilisateurs et groupes> onglet Éléments de connexion> bouton +
  3. Ajoutez l'application et marquez-la comme masquée

Pour le cacher du Dock:

  1. Cliquez avec le bouton droit sur l'application et sélectionnez Afficher le contenu du package
  2. Ouvrez Info.plist et ajoutez

<key>NSUIElement</key>
<string>1</string>
filippo
la source
Aime ça. Simple et adapté à mes besoins. Et pas obsolète.
Ivan X
0

Script Timer est un bon choix pour cela. Il peut s'exécuter à la déconnexion, à la connexion et bien plus encore. J'irais avec cela pour une solution simple et facile à utiliser. Il a une interface graphique simple:

Action déclenchée

Il y a deux choses que vous devez noter sur Script Timer. Premièrement, ce n'est pas gratuit. Cela coûte 12 $, mais je pense personnellement que ça vaut le coup. Deuxièmement, il n'est pas entièrement compatible avec Lion, mais ils ont promis une mise à jour gratuite dès qu'ils l'auraient rendu compatible.

daviesgeek
la source
1
C'est obsolète maintenant
Kirtikumar A.
0

Vous pouvez également créer une application Mac à partir de votre script en utilisant quelque chose comme Platypus , puis l'ajouter aux éléments de connexion comme n'importe quelle autre application.

svth
la source
0

Power Manager peut exécuter un script lorsqu'un utilisateur se déconnecte. Il s'agit d'un produit commercial et il prend en charge les dernières macOS.

Power Manager exécute un script à la déconnexion de la tâche Assistant Planification

Versions antérieures requises à l'aide de l'éditeur d'événements , mais une tâche Assistant Planification est désormais incluse pour exécuter des scripts lors de la connexion et de la déconnexion.

J'ai écrit Power Manager, alors n'hésitez pas à poser des questions techniques sur sa mise en œuvre. Dans le cas d'événements déclenchés par déconnexion, Power Manager n'interroge pas les modifications de l'état de l'utilisateur mais est plutôt informé des modifications de l'utilisateur par macOS. Cette approche est plus efficace que d'avoir un script en boucle / polling.

Graham Miln
la source