2 votes

Launchd exécute un Applescript toutes les deux heures

J'ai écrit un petit applescript que je voudrais exécuter automatiquement toutes les 2 heures. J'ai donc écrit le daemon launchd suivant (probablement c'est un agent) :

<?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>com.zerowidth.launched.aspect</string>
        <key>Program</key>
        <string>/usr/bin/osascript</string>
        <key>ProgramArguments</key>
        <array>
                <string>osascript</string 
                <string>/Users/***/my_script.scpt</string>
        </array>
        <key>StandardOutPath</key>
        <string>/Users/***/file_log.log</string>
        <key>RunAtLoad</key>
        <true/>
        <key>ThrottleInterval</key>
        <integer>7200</integer>
        <key>KeepAlive</key>
        <true/>
</dict>
</plist>

Puis j'ai ouvert le terminal et fait

launchctl load ~/Library/LaunchAgents/com.zerowidth.launched.aspect.plist 

Cela a bien fonctionné, mais seulement une fois et pas toutes les deux heures. En vérifiant sur la Console, j'ai obtenu les messages suivants (et bien d'autres en fait) :

com.apple.xpc.launchd[1] (com.zerowidth.launched.aspect) : Ce service est défini pour être constamment en fonctionnement et est intrinsèquement inefficace.

Dec 16 17:02:25 Air-of-myself-2 com.apple.xpc.launchd[1] (com.zerowidth.launched.aspect) : Le service n'a fonctionné que pendant 7 secondes. Repoussant le respawn de 7193 secondes.

Pouvez-vous m'aider à comprendre ce qui se passe ? Comment puis-je exécuter le script de la Apple toutes les deux heures ?

Merci.


EDIT. J'ajoute, en suivant les conseils de Robert, le script de Python et l'Applescript.

Voici le script de Python. Il demande à la console d'exécuter la commande LocateMe et à partir de là, il obtient la latitude et la longitude du lieu où je me trouve. Ensuite, il appelle une API pour obtenir l'heure du coucher et du lever du soleil à cet endroit. Enfin, une petite fonction décide si c'est le jour (lever du soleil < maintenant

output = os.popen('/Users/***/Desktop/LocateMe').read()
###I extract my coordinates 
coord = output[1:25]
lat = float(coord[1:12]) ###latitude
long = float(coord[13:25]) ### longitude

my_sunrise, my_sunset = get_ris_and_set(lat, long) ##this function calls an API that gives sunset and sunrise time in the position given by (lat,long)
my_sunset1 = my_sunset.time()
my_sunrise1 = my_sunrise.time()

result = str(is_day(now.time(), my_sunrise1, my_sunset1))
### compare the time now and returns true if it is day false otherwise    
with open('/Users/***/Desktop/log_file.txt', 'a') as f:
        print(result, file=f)
sys.exit()

Voici l'Applescript : il exécute le script Python ci-dessus et lit la valeur booléenne (si c'est jour ou non). Ensuite, il vérifie si le mode sombre sur Mojave est activé et il bascule si nécessaire.

tell application id "com.apple.systemevents"
tell application "Terminal"
    do shell script "/usr/local/bin/python3 /Users/***/Desktop/python.py $@"
end tell

tell appearance preferences
    set value to do shell script "tail -n 1 /Users/***/Desktop/log_file.txt"
    if dark mode is true and value = "True" then
        set dark mode to false
    else if dark mode is false and value = "False" then
        set dark mode to true
    else
        return
    end if
end tell
end tell

0 votes

Où se trouve la commande de fin de service pour qu'il puisse fonctionner à nouveau.

0 votes

@Buscar Je suis désolé mais je suis un débutant avec launchd... Je ne suis pas sûr d'avoir compris votre commentaire. Pourriez-vous être un peu plus explicite, s'il vous plaît ? Merci beaucoup pour votre aide !

0 votes

launchd exécute correctement votre script toutes les deux heures. Cependant, il semble que votre script s'exécute continuellement et il est inefficace d'exécuter un script qui s'exécute continuellement à un intervalle donné. Que doit faire votre script ?

3voto

Geoff Nixon Points 3143

N'est-ce pas ? StartInterval la clé pour le fonctionnement périodique ? Dans votre cas, réglé sur 7200 (secondes) ?

https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html#//apple_ref/doc/uid/10000172i-SW7-SW7

0 votes

Fantastique ! Cela fonctionne exactement comme je le voulais, merci beaucoup ! Par ailleurs, savez-vous quelle est la différence entre StartInterval et ThrottleInterval ? Si vous avez lu le code ci-dessus, pensez-vous qu'il y a une façon plus légère de l'implémenter ? Merci beaucoup, j'ai l'intention d'accepter votre réponse et de vous donner la prime (si aucune autre réponse n'apparaît entre-temps). Je vous remercie ! :-D

0 votes

Je pense que ThrottleInterval est à quelle fréquence votre processus est autorisé pour se reproduire, c'est-à-dire dans quel délai il serait autorisé à s'exécuter à nouveau. Cependant, cela n'est pas documenté, donc je ne m'en occuperais pas du tout si vous n'avez pas à le faire.

1voto

Kerry Jones Points 145

Nous avons besoin de voir tous vos scripts. [ s'ils sont courts, ou simplement avant de les poster. ] Vous pourriez invoquer le scripts Python depuis votre plist. Peut-être avez-vous des mécanismes de boucle redondants dans vos scripts. Vous devriez mettre des informations de débogage dans vos scripts. Écrivez dans un fichier dans votre scripts d'applescript et de phython. Mettez quelque chose comme "date >> mylogfile#1" dans votre shell do scripts d'applescript. Vérifier la syntaxe dans le terminal :

mac $ date >> mylogfile#1
mac $ date >> mylogfile#1
mac $ date >> mylogfile#1
mac $ cat mylogfile#1 
Sun Dec 16 19:32:17 EST 2018
Sun Dec 16 19:32:21 EST 2018
Sun Dec 16 19:32:23 EST 2018

un peu plus de poids pourrait être utile. De cette façon, vous pouvez dire si votre script est invoqué.

Vous pouvez le faire entièrement en applescript. Descendez jusqu'à " Maintenant, nous devons continuer à exécuter cette commande périodiquement en arrière-plan. "

http://scriptingosx.com/tag/stay-open/

Remarquez comment la routine d'inactivité renvoie le temps après lequel le gestionnaire d'inactivité sera à nouveau invoqué.

Robert

0 votes

Merci beaucoup pour votre intérêt et désolé pour la réponse tardive. C'est un bon point, avec l'oisiveté cela fonctionne. Mais honnêtement, je n'aime pas trop la solution du ralenti. Au final, c'est une application que je dois lancer et qui reste toujours ouverte en tâche de fond sur le Desktop... en tout cas, j'aimerais la paramétrer avec launchd pour pouvoir apprendre quelque chose de nouveau. Je vais suivre votre conseil et mettre tout le script dans l'OP. J'espère que vous pourrez m'aider. Je vous remercie de votre aide.

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