3 votes

Application Applescript pour arrêter Mathematica à un moment précis de la journée

J'ai le flux de travail suivant que je dois exécuter sur une base quotidienne pendant une période de plusieurs jours :

automation workflow

Les ordinateurs démarrent à une heure précise, Mathematica et un bloc-notes Mathematica spécifique sont lancés et évalués. Je dois ensuite quitter Mathematica de manière programmatique et laisser les programmes correspondants éteindre les ordinateurs. J'ai tout prévu ici, sauf l'étape mise en évidence pour quitter Mathematica avec une application Applescript.

Pour commencer, j'ai créé une application simple à l'aide de l'application Éditeur Applescript :

tell application "Mathematica" to quit

Cela arrêtera Mathematica si le carnet de notes ouvert a été sauvegardé, ce que le carnet de notes fait lui-même. Je dois maintenant ajouter une minuterie à l'application Applescript.

Une question précédente Flux de travail Automator ou AppleScript pour fermer Safari après un certain temps fait quelque chose de similaire que j'espérais pouvoir adapter à mes besoins. Il affiche le code suivant :

global quit_after, check_every

set quit_after to 2700
set check_every to 10
set minute to quit_after / 60

display dialog "Check is performed every " & check_every & " seconds. Things will be quit after " & minute & " minutesof system inactivity."

on reopen
    display dialog "Check is performed every " & check_every & " seconds. Things will be quit after " & minute & " minutes of system inactivity."
end reopen

on idle
    set idletime to do shell script "echo $((`ioreg -c IOHIDSystem | sed -e '/HIDIdleTime/ !{ d' -e 't' -e '}' -e 's/.* = //g' -e 'q'` / 1000000000))"
    if (idletime as integer) > quit_after then
        tell application "System Events"
            if ((name of processes) contains "Safari") then
                tell application "Safari" to quit
            end if
        end tell
    end if
    return check_every
end idle

Je n'ai pas besoin des boîtes de dialogue et je veux qu'il ferme Mathematica au bout de 15 minutes, par exemple. J'ai donc essayé ceci comme prochaine étape vers une solution.

global quit_after, check_every

set quit_after to 900
set check_every to 10
set minute to quit_after / 60

on idle
    set idletime to do shell script "echo $((`ioreg -c IOHIDSystem | sed -e '/HIDIdleTime/ !{ d' -e 't' -e '}' -e 's/.* = //g' -e 'q'` / 1000000000))"
    if (idletime as integer) > quit_after then
        tell application "System Events"
            if ((name of processes) contains "Mathematica") then
                tell application "Mathematica" to quit
            end if
        end tell
    end if
    return check_every
end idle

Ça ne marche pas.

J'ai donc deux questions, quelqu'un peut-il me conseiller ?

  • Comment faire pour que mon code modifié fonctionne ?
  • Comment le modifier pour qu'il arrête Mathematica à une heure précise les jours de semaine uniquement ?

Cette dernière solution me conviendrait mieux, car je pense que j'aurais moins de conflits si j'arrêtais Mathematica à un moment précis plutôt qu'après un certain laps de temps.

5voto

Voici pourquoi ça ne marche pas.

HIDIdleTime est le nombre de secondes d'inactivité, donc à moins que l'utilisateur ne fasse absolument rien pendant quinze minutes, votre script ne fonctionne pas.

Voici comment procéder en AppleScript.

set timeToQuit to 50700 -- time in seconds =14h05
set currDate to current date

-- do nothing on Saturday and Sunday or this script is launched after 14h05
if weekday of currDate is in {Saturday, Sunday} or (time of currDate) > timeToQuit then return

delay (timeToQuit - (time of currDate)) -- wait 
tell application "System Events" to exists process "Mathematica"
if the result then quit application "Mathematica"

4voto

moodforaday Points 2633

Ok, bien, voici comment vous feriez fonctionner launchd à 14h05.

Copiez-le à l'aide d'un éditeur de texte et sauvegardez-le sous le nom de ~/Bibliothèque/LaunchAgents/com.tjluoma.quit-at-time.plist

<?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>com.tjluoma.quit-at-time</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/killMathematica.sh</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>14</integer>
        <key>Minute</key>
        <integer>5</integer>
    </dict>
</dict>
</plist>

Notez que vous devrez vous déconnecter ou vous connecter ou utiliser launchctl load ~/Library/LaunchAgents/com.tjluoma.quit-at-time.plist

Maintenant, le /usr/local/bin/killMathematica.sh pourrait pointer vers ce que vous voulez exécuter : une application, un AppleScript ou un shell script.

La solution la plus simple est un shell script :

#!/bin/zsh

APP='Mathematica'

PID=$(ps cx | fgrep "$APP" | awk '{print $1}')

    # if $APP isn't running, then just exit already
[[ "$PID" == "" ]] && exit 0

    # if we get here, then $APP is running
    # tell it to quit using AppleScript
    # if this exits properly, the script will exit too
osascript -e "tell application \"$APP\" to quit" && exit 0

    # if we get here, AppleScript didn't work, so let's try
    # sending the app a 'kill' message
kill -QUIT "$PID" && exit 0

exit 1

# EOF

enregistrez le sous le nom de '/usr/local/bin/killMathematica.sh' (ou n'importe où ailleurs) et faites le chmod 755

Testez-le et voyez s'il fonctionne.

Maintenant que je vous ai donné la réponse à la question que vous a demandé

Voici une meilleure solution : utiliser Maestro du clavier . C'est beaucoup plus facile.

Facile comment ?

http://images.luo.ma/Keyboard_Maestro_Quit_at_Specific_Time-20120717-195546.jpg

Boom. C'est fait.

Pas de launchd. Pas de cron. Pas d'AppleScript.

(J'ai dû utiliser VLC au lieu de Mathematica car je n'ai pas Mathematica installé).

2voto

Ged Byrne Points 481

The tl;dr Version

  1. Exécuter crontab -e dans le terminal.
  2. Coller dans 5 14 * * 1-5 osascript -e 'tell application "Mathematica" to quit' sur une nouvelle ligne.
  3. Économisez.

La version détaillée

Je suis loin d'être un expert d'Applescript, donc je ne peux pas offrir beaucoup de feedback sur la raison pour laquelle votre script ne fonctionne pas, mais je peux offrir une option alternative (et plus simple).

Presque tous les systèmes de type UNIX, y compris OS X, disposent de la fonction cron qui peut exécuter des commandes selon un programme défini. OS X dispose également de lancé sur le marché mais c'est un peu plus délicat à utiliser, nous allons donc nous en tenir à cron.

Le format crontab

Cron est juste un fichier texte simple qui exécute des commandes basées sur une structure simple.

  • Chaque ligne de la crontab est un travail distinct, sous la forme suivante minute hour day-of-the-month month day-of-the-week command chaque champ étant séparé par un espace.
    • * à tout moment, et vous pouvez mettre des entrées multiples séparées par des virgules ( 1,3,5 ) ou utiliser un trait d'union pour une plage ( 1-5 ).
    • Les heures sont indiquées sur une horloge de 24 heures.
    • Notez la distinction entre le jour du mois et le jour de la semaine. Attention à ne pas paramétrer les deux, vous ne souhaitez probablement utiliser que l'un ou l'autre ; c'est-à-dire si jour du mois est 13 et le jour de la semaine est 5, votre travail sera sólo se déroulent le vendredi 13, pas tous les vendredis et tous les 13 du mois).
    • Les jours de la semaine vont de 0 à 7, 0 et 7 signifiant dimanche.

Exemples

0 15 * * 1-5 /usr/bin/blah exécuterait /usr/bin/blah à 15 heures, du lundi au vendredi, à n'importe quelle date du calendrier de n'importe quel mois.

15 * 1 1-6 * /usr/bin/blah exécute la même commande à 15 minutes de chaque heure du premier jour de janvier à juin, quel que soit le jour de la semaine.

Votre entrée cron spécifique

Sur la base de l'horaire indiqué dans votre question, pour quitter Mathematica à 14 h 05 tous les jours de la semaine, la ligne applicable serait la suivante 5 14 * * 1-5 osascript -e 'tell application "Mathematica" to quit'

  • osascript exécute Applescript à partir de la ligne de commande, soit à partir d'un fichier, soit à partir d'une ligne unique que vous spécifiez (comme nous le faisons ici).

Ajout d'une tâche cron

  1. Terminal ouvert
    • En option : si vous n'êtes pas à l'aise avec le vim changez l'éditeur de l'interpréteur de commandes pour un avec lequel vous êtes à l'aise (je suggère nano si vous n'avez pas de préférence) en exécutant la commande suivante : export EDITOR=nano (changement nano à votre éditeur préféré). Notez que vous devriez probablement vous en tenir aux éditeurs basés sur le shell, les éditeurs GUI peuvent ne pas fonctionner avec les particularités de cron dans l'enregistrement des fichiers.
  2. Type crontab -e et appuyez sur entrée pour ouvrir le crontab dans l'éditeur.
    • Chaque utilisateur possède sa propre crontab, et les commandes sont exécutées avec ses permissions. Vous devez donc effectuer cette opération en tant qu'utilisateur qui exécute Mathematica en premier lieu.
  3. Sur une nouvelle ligne (ou la première ligne s'il n'y a pas d'autres entrées), entrez la commande que nous avons déterminée plus tôt : 5 14 * * 1-5 osascript -e 'tell application "Mathematica" to quit' .
  4. Enregistrez le fichier (control-O dans nano) et quittez votre éditeur.

Ça devrait le faire. Il est évident que vous devrez le tester pour vous assurer qu'il n'y a pas d'erreurs de formatage dans votre crontab, mais cela devrait être tout ce dont vous aurez besoin pour quitter un programme.

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