3 votos

Una aplicación de Apple para apagar Mathematica a una hora específica del día

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

automation workflow

Las computadoras se inician en un momento específico, Mathematica y un cuaderno de Mathematica específico se lanzan y evalúan. Luego tengo que dejar Mathematica programáticamente y dejar que los horarios relevantes apaguen las computadoras. He resuelto todo aquí excepto el paso resaltado para dejar Mathematica con una aplicación de Applescript.

Para empezar, he creado una simple aplicación usando el Editor de Apple :

tell application "Mathematica" to quit

Esto apagará Mathematica si el cuaderno abierto ha sido guardado, lo que el cuaderno hace por sí mismo. Ahora necesito agregar un temporizador a la aplicación de Applescript.

Una pregunta anterior Flujo de trabajo automático 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 digamos 15 minutos, así que intenté esto como un próximo 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.

Así que tengo dos preguntas, ¿puede alguien sugerir:

  • ¿Cómo hacer que mi código modificado funcione?
  • ¿Cómo alterarlo para que apague Mathematica a una hora específica sólo en días de semana?

Lo último funcionaría mejor para mí, ya que creo que tendría menos conflictos si apagara Mathematica en un momento específico en vez de después de que haya pasado una cierta cantidad de tiempo.

5voto

Baczek Puntos 150

Esto es por lo que no funciona.

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

Aquí está 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"

4voto

moodforaday Puntos 2633

Ok, bueno, así es como harías el lanzamiento a las 2:05 p.m.

Copia esto usando un editor de texto y guárdalo 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 tendrá que cerrar la sesión/login o usar launchctl load ~/Library/LaunchAgents/com.tjluoma.quit-at-time.plist

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

La solución más fácil es una concha 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

guarda eso como '/usr/local/bin/killMathematica.sh' (o donde sea) y hazlo chmod 755

Pruébelo y vea si funciona.

Ahora que te he dado la respuesta a la pregunta preguntó a

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

¿Cómo de fácil?

Boom. Hecho.

No hay lanzamiento. No hay cron. Sin AppleScript.

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

2voto

Ged Byrne Puntos 481

La versión tl;dr

  1. Ejecute crontab -e en la Terminal.
  2. Pegar en 5 14 * * 1-5 osascript -e 'decirle a la aplicación "Mathematica" que abandone' en una nueva línea.
  3. Salve.

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, incluyendo OS X, tiene el cron demonio, que puede ejecutar comandos en un horario establecido. OS X también tiene Lanzamiento pero es un poco más difícil de usar, así que nos quedaremos con Cron.

El formato crontab

Cron es sólo un archivo de texto plano que ejecuta comandos basados en una estructura simple.

  • Cada línea en el cronómetro 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 puedes poner varias entradas separadas por comas ( 1,3,5 ) o utilizar 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. Ten cuidado con el ajuste de ambos, probablemente sólo quieras usar uno o el otro; es decir. si día del mes es 13 y el día de la semana es 5, tu trabajo será sólo se ejecutan el viernes 13, no todos los viernes y cada 13 del mes).
    • Los días de la semana van de 0 a 7, con el 0 y el 7 significando el domingo.

Ejemplos

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

15 * 1 1-6 * /usr/bin/blah ejecuta el mismo comando a 15 minutos de cada hora en el primer día de enero a junio, sin importar qué día de la semana sea.

Su entrada cron específica

Basado en el horario de su pregunta, para dejar Mathematica a las 2:05 PM cada día de la semana, la línea aplicable sería 5 14 * * 1-5 osascript -e 'tell application "Mathematica" to quit'

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

Añadiendo un trabajo de cronista

  1. Terminal abierto
    • Opcional: si no te sientes cómodo con la vim editor, cambie el editor de la cáscara a uno con el que se sienta cómodo (sugiero nano si no tienes una preferencia) ejecutando el siguiente comando: export EDITOR=nano (cambio nano a su editor preferido). Ten en cuenta que probablemente deberías ceñirte a los editores basados en shell, los editores GUI pueden no funcionar con las peculiaridades de cron para guardar los archivos.
  2. Escriba crontab -e y pulse intro para abrir el cronómetro en el editor.
    • Cada usuario tiene su propio crontab, y los comandos son ejecutados con sus permisos, de modo que usted debe hacer esto como cualquier usuario que esté ejecutando Mathematica en primer lugar.
  3. En una nueva línea (o en la primera línea si no hay otras entradas), introduzca el comando que determinamos anteriormente: 5 14 * * 1-5 osascript -e 'tell application "Mathematica" to quit' .
  4. Guarda el archivo (control-O en nano) y abandona el editor.

Eso debería bastar. Obviamente querrás probarlo para asegurarte de que no hay errores de formato en tu agenda, pero eso debería ser todo lo que necesitas para dejar de fumar en un horario.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X