11 votes

Comment exécuter script au réveil ?

Je cherche une méthode pour exécuter un script (enfin, une simple commande shell) lorsque mon ordinateur portable sort de son sommeil.

Cette question a déjà été posée mais il y a 8 ans (pour OS X Lion), et plusieurs des réponses nécessitent des produits tiers qui ne sont plus développés aujourd'hui.

Une autre option pourrait être que le script s'exécute à tout moment, une fois par jour, lorsqu'il est en marche, mais je ne veux pas qu'il manque un créneau horaire alloué juste parce qu'il n'est pas réveillé. Je ne suis pas tellement gêné par le déclenchement d'un script à l'heure du sommeil.

8voto

Edd Growl Points 2206

Vous pouvez installer SleepWatcher via homebrew et définissez un code .wake avec votre script qui sera lancé chaque fois que votre ordinateur portable sortira de sa veille.

Pour utiliser SleepWatcher : créez un shell script dans votre répertoire personnel nommé .wake et donnez-lui la permission avec la commande chmod +x ~/.wake .

Vous pouvez découvrir comment utiliser SleepWatcher aquí

8voto

Seamus Points 3171

launchd peut faire ce dont vous avez besoin. Tant que votre système n'est pas endormi toute la journée, et qu'il est programmé à l'aide de la fonction StartCalendarInterval (voir ci-dessous), launchd exécutera votre script une fois par jour. Voici ce que je veux dire :

  • Si vous programmez l'exécution de votre script à (par exemple) 12h00, ET que votre mac est réveillé à 12h00, alors votre script s'exécutera à 12h00.
  • Si vous programmez l'exécution de votre script à (par exemple) 12h00, MAIS que votre mac est endormi à 12h00, alors votre script s'exécutera dès que votre mac se réveillera.

IMHO, launchd a un avantage car il fait partie de MacOS. Le seul outil tiers que vous pourriez vouloir utiliser avec lui est le suivant LaunchControl (au lieu de la version native launchctl ). LaunchControl est une application basée sur l'interface graphique utilisée uniquement pour vous aider à créer/modifier votre site web. .plist et peut aider à la gestion et au dépannage si cela s'avère nécessaire. Le site .plist contient les instructions qui seront utilisées par launchd pour démarrer votre programme, et peut être très simple. Et bien sûr, vous pouvez éviter complètement les logiciels tiers en créant simplement l'application .plist "manuellement" avec un éditeur de texte.

Comme mentionné ci-dessus, le clé de configuration que vous devez utiliser dans votre .plist pour planifier l'heure d'exécution de votre travail/script est StartCalendarInterval . Selon man launchd.plist :

Contrairement à cron qui ignore les invocations de tâches lorsque l'ordinateur est endormi, launchd lancera la tâche au prochain réveil de l'ordinateur. Si plusieurs intervalles s'écoulent avant le réveil de l'ordinateur, ces événements seront regroupés en un seul lors de la sortie du sommeil.

Exemple

Voici un exemple de la façon d'utiliser launchd pour créer un User Agent . Le champ d'application d'un User Agent est qu'il ne fonctionne que pour un seul utilisateur. Notez qu'il est également possible de créer Global Agent ou un Global Daemon qui fonctionne pour plusieurs/tous les utilisateurs, mais nous laisserons cela pour un autre jour. :

  1. Créez un script dans votre répertoire personnel ( ~/ ) pour afficher la date et l'heure à chaque fois qu'il est exécuté :

    !/bin/bash

    CURRENTDATE=date +"%c" echo Current Date and Time is: ${CURRENTDATE}

Nommez le script. echodatetime.sh & le rendre exécutable :

$ chmod 755 ~/echodatetime.sh  
  1. Créez un fichier .plist dans ~/Bibliothèque/LaunchAgents/sdm.simple.exampleofPLIST.plist :

EDIT : NOTE ! NE PAS UTILISER ~/ comme raccourci pour le répertoire personnel de l'utilisateur ! Vous devez utiliser un chemin complet, sinon cela ne fonctionnera pas.

<?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>Disabled</key>
    <false/>
    <key>Label</key>
    <string>seamus.simple.example</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/seamus/echodatetime.sh</string>
    </array>
    <key>StandardErrorPath</key>
    <string>/Users/seamus/echodatetime.error.txt</string>
    <key>StandardOutPath</key>
    <string>/Users/seamus/echodatetime.log.txt</string>
    <key>StartCalendarInterval</key>
    <array>
      <dict>
          <key>Hour</key>
          <integer>1</integer>
          <key>Minute</key>
          <integer>25</integer>
      </dict>
      <dict>
          <key>Hour</key>
          <integer>1</integer>
          <key>Minute</key>
          <integer>26</integer>
      </dict>
      <dict>
          <key>Hour</key>
          <integer>1</integer>
          <key>Minute</key>
          <integer>27</integer>
      </dict>
      <dict>
          <key>Hour</key>
          <integer>1</integer>
          <key>Minute</key>
          <integer>28</integer>
      </dict>
      <dict>
          <key>Hour</key>
          <integer>1</integer>
          <key>Minute</key>
          <integer>29</integer>
      </dict>
    </array>
</dict>
</plist>

Ce fichier .plist va provoquer ~/echodatetime.sh à exécuter chaque jour aux heures suivantes :
01:25
01:26
01:27
01:28
01:29

Vous pouvez modifier le integer valeurs dans le tableau pour la clé StartCalendarInterval pour obtenir le timing qui vous convient. Il s'agit juste d'un exemple que j'ai utilisé pour tester.

L'exemple ci-dessus montre une "rafale" de cinq (5) passages à une minute d'intervalle. Cela a été fait pour montrer la syntaxe quelque peu étrange requise pour une telle programmation. La programmation d'un seul événement à exécuter une fois par jour, tous les jours, à midi, peut être réalisée en substituant la syntaxe plus simple suivante StartCalendarInterval indiquée ci-dessous dans le .plist montré ci-dessus :

    <key>StartCalendarInterval</key>
    <array>
        <dict>
            <key>Hour</key>
            <integer>12</integer>
            <key>Minute</key>
            <integer>0</integer>
        </dict>
    </array>  
  1. load votre travail et vérifiez qu'il est en cours d'exécution :

    $ launchctl load ~/Library/LaunchAgents/sdm.simple.exampleofPLIST.plist
    $ launchctl list | grep seamus

    • 0 seamus.simple.example
  2. Surveillez le fichier de sortie déclaré dans le fichier StandardOutPath clé :

    $ tail -f ~/echodatetime.log.txt

Après load ing le fichier .plist, vous verrez l'affichage de la date et de l'heure aux moments indiqués dans le fichier .plist. StartCalendarInterval clé : à intervalles d'une minute commençant à 01:25 et se terminant à 01:29 si vous utilisez mon fichier .plist.

Miscellany

  • En .plist Les fichiers ci-dessus ont été testés et ont fonctionné avec succès sur mon macbook pro sous Mojave (ver 10.14.6). J'ai également vérifié le comportement de launchd lorsqu'un calendrier d'événements se produit pendant sleep : La tâche s'est exécutée immédiatement après le "réveil" du mac, et a enregistré l'heure à laquelle il s'est réveillé (c'est-à-dire pas l'heure prévue).

  • Oui, la syntaxe .plist est obscure ! Pensez à utiliser LaunchControl au lieu de pirater manuellement ces fichiers.

  • Une astuce potentiellement utile : vous pouvez vérifier la syntaxe de votre fichier .plist comme suit :

    $ plutil -lint /Users/seamus/Library/LaunchAgents/sdm.simple.exampleofPLIST.plist
    /Users/seamus/Library/LaunchAgents/sdm.simple.exampleofPLIST.plist: OK

  • Quand vous aurez fini avec cet exemple, vous pourrez remove le travail de launchd puis supprimez ou déplacez le fichier de votre dossier. ~/Library/LaunchAgents . Sinon, votre travail sera relancé par launchd la prochaine fois que vous vous connecterez :

    $ launchctl remove seamus.simple.example
    $ mv ~/LaunchAgents/sdm.simple.exampleofPLIST.plist ~/archive

Alternativement, laissez le fichier où il est, et définissez l'attribut Disabled pour true dans le .plist :

    <key>Disabled</key>
    <true/>

8voto

moodforaday Points 2633

Il n'y a aucun moyen de faire du "run on wake" sans logiciel tiers. launchd ne prend pas en charge cette fonctionnalité de manière native, de sorte que toute solution qui tente d'utiliser la fonction launchd aura de fortes chances d'échouer.

Cela dit, il existe plusieurs bonnes options tierces.

SleepWatcher mentionné par Edd Growl est la seule solution gratuite que je connaisse. Elle n'a pas été mise à jour depuis longtemps, mais pour autant que je sache, elle fonctionne toujours.

Gestionnaire d'énergie qui était également mentionné ci-dessus est un outil incroyablement puissant et performant. Je voulais me faire l'écho de la recommandation pour cette application, car je ne suis pas impliqué dans son développement, mais je suis juste un heureux client payant. (Je peux également dire que le développeur de Power Manager est très réactif).

Maestro du clavier peut exécuter scripts au réveil, ou au sommeil, et probablement des centaines d'autres choses. C'est un outil tellement polyvalent que je recommande à tout propriétaire sérieux de Mac d'en posséder une copie. (Il peut remplacer au moins une douzaine d'autres utilitaires.) Keyboard Maestro est l'une des premières applications que je dois installer sur un nouveau Mac, sinon il semble tout simplement cassé. C'est la solution que je recommande. Power Manager vient juste après.


Modifié pour ajouter : Si vous voulez exécuter quelque chose une fois par jour, alors launchd est une bonne solution, et c'est gratuit -- bien que la syntaxe soit difficile à Je recommanderais LaunchControl .

8voto

Iceberg Points 251

Cette fonctionnalité consistant à exécuter script après le réveil peut être réalisée avec la puissante fonction cuillère à marteau :

function printf(s,...)  print(s:format(...)) end
wather = hs.caffeinate.watcher.new(function(eventType)    
    -- screensDidWake, systemDidWake, screensDidUnlock
    if eventType == hs.caffeinate.watcher.systemDidWake then
        local output = hs.execute("/bin/echo -n hello", false)
        hs.notify.new({title="TestTitle", informativeText=output}):send()
        printf("%s, world", output)
    end
end)
wather:start()

Mettez ces script à $HOME/.hammerspoon/init.lua et rechargez hammerspoon, et vous pouvez vérifier la sortie /bin/echo ci-dessus dans la console hammerspoon.
Il existe plusieurs événements de veille/de sommeil, notamment écransDidWake , systemDidWake , screensDidUnlock , écransDidSleep , systemWillSleep . Voir api hs.caffeinate.watcher doc pour plus de détails.

1voto

Graham Miln Points 39606

Gestionnaire d'énergie

Gestionnaire d'alimentation DssW est capable d'exécuter des scripts sur le sillage. scripts peut être exécuté comme un utilisateur spécifique ou dans la session de l'utilisateur graphique actif.

Mentionné dans l'original réponse acceptée Il y a huit ans, Power Manager a été développé et soutenu depuis 1997.

Je travaille sur Power Manager ; n'hésitez donc pas à poser des questions techniques sur son fonctionnement.

Power Manager on macOS

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X