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 ?0 votes
Mmm, je vois. Merci pour votre réponse ! Mon applescript exécute un script ( !) qui vérifie l'heure actuelle et décide si c'est le jour ou la nuit (en fonction de ma position). Ensuite, il active/désactive le mode sombre de Mojave. Comment puis-je gérer cela d'une meilleure manière ? Peut-être que je devrais mettre une instruction dans l'Applescript pour qu'il ne s'exécute pas continuellement... Merci d'avance !
0 votes
En supposant que votre script Python s'exécute, vérifie la date, fait ce qu'il a à faire et sort, il ne s'exécute pas continuellement (sauf si vous avez une erreur où il attend quelque chose).
KeepAlive
est fixé à true ?0 votes
Voir ceci répondre et ceci répondre pour plus de détails.
0 votes
@Allan Merci beaucoup, vos commentaires ont été utiles. En fait, je ne suis pas sûr que mon script Python "sorte" : comment dois-je faire ? Le problème est probablement caché dans le fait que l'AppleScript ne se termine pas. Comment suis-je censé le faire ? Existe-t-il une commande ? [btw dois-je poster tous mes script ? Je ne l'ai pas encore fait parce qu'ils sont assez longs et que cela deviendrait ma question aussi - à part le fait que les script sont horribles et que seuls Dieu et moi savons ce que nous voulons dire :-) - bientôt seul Dieu le saura :-):-)] Merci !