La aplicación Applescript para cerrar Mathematica a una hora específica del día

3

Tengo el siguiente flujo de trabajo que necesito ejecutar diariamente por un período de días:

Lascomputadorasseinicianaunahoraespecífica,MathematicayuncuadernoespecíficodeMathematicaseinicianyevalúan.LuegonecesitodejarMathematicaprogramáticamenteydejarqueloshorariosrelevantesapaguenlascomputadoras.Heresueltotodoaquí,exceptoelpasoresaltadoparasalirdeMathematicaconunaaplicaciónApplescript.

Paraempezar,creéunaaplicaciónsimpleusandoelEditordeApple:

tellapplication"Mathematica" to quit

Esto cerrará Mathematica si se ha guardado el cuaderno abierto que el cuaderno hace por sí mismo. Ahora necesito agregar un temporizador a la aplicación Applescript.

Una pregunta anterior El flujo de trabajo de Automator o AppleScript para cerrar Safari después de un período de tiempo hace algo similar que esperaba adaptar a mis necesidades. Muestra el siguiente código:

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

No necesito los cuadros de diálogo y quiero que cierre Mathematica después de unos 15 minutos, así que intenté esto como el siguiente paso hacia una solución.

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

No funciona.

Tengo dos preguntas, ¿alguien puede sugerirlo?

  • ¿Cómo hacer que mi código modificado funcione?
  • ¿Cómo modificarlo para que cierre Mathematica a una hora específica solo en días laborales?

El último funcionaría mejor para mí ya que creo que tendría menos conflictos si cierro Mathematica en un momento específico en lugar de después de que haya transcurrido cierto tiempo.

    
pregunta Jagra 17.07.2012 - 20:24

3 respuestas

5

He aquí por qué no funciona.

HIDIdleTime es el número de segundos de inactividad, por lo que, a menos que el usuario no haga absolutamente nada durante quince minutos, su script no funciona.

Aquí se explica cómo hacer esto 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"
    
respondido por el jackjr300 18.07.2012 - 05:35
4

Ok, bueno, así es como harías que launchd se ejecute a las 2:05 p.m.

Copie esto utilizando un editor de texto y guárdelo como ~/Library/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>

Tenga en cuenta que necesitará cerrar sesión / iniciar sesión o usar launchctl load ~/Library/LaunchAgents/com.tjluoma.quit-at-time.plist

Ahora, la línea /usr/local/bin/killMathematica.sh podría apuntar a lo que sea que quieras ejecutar: una aplicación, un AppleScript o un script de shell.

La solución más fácil es un script de shell:

#!/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

guárdalo como '/usr/local/bin/killMathematica.sh' (o donde sea) y haz que sea chmod 755

Pruébelo y vea si funciona.

Ahora que te he dado la respuesta a la pregunta que hiciste ...

Aquí hay una mejor solución: use Keyboard Maestro . Es mucho más fácil.

¿Qué tan fácil?

enlace

Boom. Hecho.

No launchd. No cron No AppleScript.

(Tuve que usar VLC en lugar de Mathematica porque no tengo Mathematica instalado).

    
respondido por el TJ Luoma 18.07.2012 - 01:58
2

La versión tl; dr

  1. Ejecutar crontab -e en la Terminal.
  2. Pegue en 5 14 * * 1-5 osascript -e 'le dice a la aplicación "Mathematica" que salga' en una nueva línea.
  3. guardar.

La versión detallada

Estoy lejos de ser un experto en Applescript, por lo que no puedo ofrecer muchos comentarios sobre por qué tu script no funciona, pero puedo ofrecer una opción alternativa (y más simple).

Casi cualquier sistema similar a UNIX, incluido OS X, tiene el cron daemon, que puede ejecutar comandos en un horario establecido. OS X también tiene launchd , pero eso es un un poco más difícil de usar, así que nos quedaremos con cron.

El formato crontab

Cron es solo un archivo de texto simple que ejecuta comandos basados en una estructura simple.

  • Cada línea en el crontab es un trabajo separado, en la forma minute hour day-of-the-month month day-of-the-week command , con cada campo separado por un espacio.
    • * significa en cualquier momento, y puede colocar entradas múltiples separadas por comas ( 1,3,5 ) o usar un guión para un rango ( 1-5 ).
    • Las horas están en un reloj de 24 horas.
    • Observe la distinción entre el día del mes y el día de la semana. Tenga cuidado al configurar ambos, es probable que solo quiera usar uno u otro; ie si día del mes es 13 y el día de la semana es 5, su trabajo solo se ejecutará el viernes 13, no todos los viernes y cada 13 del mes).
    • Los días de la semana van de 0 a 7, y 0 y 7 significan el domingo.

Ejemplos

0 15 * * 1-5 /usr/bin/blah ejecutaría /usr/bin/blah a las 3 PM de lunes a viernes en cualquier fecha del calendario de cualquier mes.

15 * 1 1-6 * /usr/bin/blah ejecuta el mismo comando a los 15 minutos de cada hora del primer día de enero a junio, independientemente del día de la semana en que se encuentre.

Tu entrada cron específica

Según el programa de su pregunta, para salir de Mathematica a las 2:05 PM todos los días de la semana, la línea correspondiente sería 5 14 * * 1-5 osascript -e 'tell application "Mathematica" to quit'

  • osascript ejecuta Applescript desde la línea de comando, ya sea desde un archivo o una línea que especifique (como lo estamos haciendo aquí).

Agregando un trabajo cron

  1. Terminal abierta
    • Opcional: si no está cómodo con el editor vim , cambie el editor de shell a uno con el que esté cómodo (sugiero nano si no tiene una preferencia) ejecutando el siguiente comando: export EDITOR=nano (cambie nano a su editor preferido). Tenga en cuenta que probablemente debería ceñirse a los editores basados en shell, los editores de GUI pueden no funcionar con las peculiaridades de Cron al guardar los archivos.
  2. Escriba crontab -e y presione enter para abrir el crontab en el editor.
    • Cada usuario tiene su propio crontab, y los comandos se ejecutan con sus permisos, por lo que debe hacer esto como cualquier usuario que ejecute Mathematica en primer lugar.
  3. En una nueva línea (o la primera línea si no hay otras entradas), ingrese el comando que determinamos anteriormente: 5 14 * * 1-5 osascript -e 'tell application "Mathematica" to quit' .
  4. Guarde el archivo (control-O en nano) y salga de su editor.

Eso debería hacerlo. Obviamente, querrá probarlo para asegurarse de que no haya errores de formato en su crontab, pero eso es todo lo que necesitará para salir de un programa.

    
respondido por el robmathers 17.07.2012 - 21:59

Lea otras preguntas en las etiquetas