App di Applescript per arrestare Mathematica in un momento specifico della giornata


3

Ho il seguente flusso di lavoro che devo eseguire quotidianamente per un periodo di giorni:

automation workflow

I computer partono in un momento specifico, Mathematica e uno specifico taccuino Mathematica vengono lanciati e valutati. Quindi ho bisogno di uscire da Mathematica a livello di programmazione e lasciare che i programmi rilevanti chiudano i computer. Ho risolto tutto qui tranne il passaggio evidenziato per uscire da Mathematica con un'applicazione Applescript.

Per cominciare ho creato una semplice applicazione usando il Editor di Applescript :

tell application "Mathematica" to quit

Questo spegnerà Mathematica se il taccuino aperto è stato salvato e il notebook lo fa da solo. Ora ho bisogno di aggiungere un timer all'applicazione Applescript.

Una domanda precedente Automazione del flusso di lavoro o AppleScript per chiudere Safari dopo un periodo di tempo fa qualcosa di simile che speravo di adattarmi alle mie esigenze. Mostra il seguente codice:

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

Non ho bisogno delle finestre di dialogo e voglio che chiuda Mathematica dopo aver detto 15 minuti, quindi ho provato questo come un passo successivo verso una soluzione.

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

Non funziona

Quindi ho due domande, qualcuno può suggerire:

  • Come far funzionare il mio codice modificato?
  • Come modificarlo in modo da spegnere Mathematica in un momento specifico solo nei giorni feriali?

Quest'ultimo avrebbe funzionato meglio per me in quanto penso che avrei avuto meno conflitti se chiudessi Mathematica in un momento specifico piuttosto che dopo un certo periodo di tempo.


Ho trovato un lavoro intorno alla menzione bares. Usa il mio primo Applescript (il più breve), salvalo come uno script piuttosto che come un'app, quindi programmalo per l'esecuzione in momenti specifici da iCal. Funziona alla grande. No muss senza storie. Ancora voglio una soluzione di Applescript in modo da poter imparare meglio.
Jagra

Risposte:


5

Ecco perché non funziona.

HIDIdleTime è il numero di secondi di inattività, quindi a meno che l'utente non faccia assolutamente nulla durante quindici minuti, lo script non funziona.

Ecco come farlo in 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"

Bella e una risposta specifica alla domanda. Grazie per l'aiuto. Apprezzo molto anche la spiegazione del perché la mia sceneggiatura non ha funzionato. Grazie.
Jagra

4

Ok, ecco, come faresti il ​​lancio alle ore 14:05.

Copia questo usando un editor di testo e salvalo come ~ / 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>

Nota che dovrai uscire / accedere o usare launchctl load ~/Library/LaunchAgents/com.tjluoma.quit-at-time.plist

Ora il /usr/local/bin/killMathematica.sh linea potrebbe indicare qualunque cosa tu voglia eseguire: un'app, un AppleScript o uno script di shell.

La soluzione più semplice è uno script di 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

salvalo come "/usr/local/bin/killMathematica.sh" (o dovunque) e fallo chmod 755

Provalo e vedi se funziona.

Ora che ti ho dato la risposta alla domanda chiesto ...

Ecco una soluzione migliore: uso Maestro della tastiera . È molto più facile

Com'è facile?

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

Boom. Fatto.

Nessun lancio. Nessun cron. Nessun AppleScript.

(Ho dovuto usare VLC invece di Mathematica perché non ho installato Mathematica.)


1
Avrai bisogno di modificare il launchd plist in modo che venga eseguito solo nei giorni feriali. Penso che questo debba essere fatto tramite una serie di dizionari nella chiave StartCalendarInterval.
robmathers

Apprezzo la soluzione. Ma perché non fare tutto in AppleScript? Ha qualche problema con affidabilità o robustezza che dovrei sapere?
Jagra

2

La versione tl; dr

  1. Eseguire crontab -e nel terminale.
  2. Incolla in 5 14 * * 1-5 osascript -e 'dire all'applicazione "Mathematica" per uscire' su una nuova riga.
  3. Salvare.

La versione dettagliata

Sono lontano da un esperto di Applescript, quindi non posso offrire molti feedback sul motivo per cui il tuo script non funziona, ma posso offrire un'opzione alternativa (e più semplice).

Praticamente qualsiasi sistema simile a UNIX, incluso OS X ha il cron daemon, che può eseguire comandi su una pianificazione prestabilita. OS X ha anche launchd , ma è un po 'più complicato da usare, quindi continueremo con cron.

Il formato crontab

Cron è solo un semplice file di testo che esegue comandi basati su una struttura semplice.

  • Ogni riga nel crontab è un lavoro separato, nel modulo minute hour day-of-the-month month day-of-the-week command, con ogni campo separato da uno spazio.
    • * significa in qualsiasi momento e puoi inserire più voci separate da virgole ( 1,3,5 ) o utilizzare un trattino per un intervallo ( 1-5 ).
    • Le ore sono su un orologio di 24 ore.
    • Nota la distinzione tra giorno del mese e giorno della settimana. Stai attento a impostare entrambi, probabilmente vuoi usare solo uno o l'altro; cioè Se giorno del mese è 13 e il giorno della settimana è 5, il tuo lavoro lo farà solo corri venerdì 13, non tutti i venerdì e ogni 13 del mese).
    • I giorni della settimana vanno da 0 a 7, con entrambi 0 e 7 che indicano domenica.

Esempi

0 15 * * 1-5 /usr/bin/blah sarebbe eseguito /usr/bin/blah alle 15:00 ogni lunedì a venerdì in qualsiasi data del calendario di qualsiasi mese.

15 * 1 1-6 * /usr/bin/blah esegue lo stesso comando a 15 minuti di ogni ora dal primo giorno di gennaio a giugno, indipendentemente dal giorno della settimana in cui si trova.

La tua specifica cron entry

Sulla base del programma nella tua domanda, per uscire da Mathematica alle 2:05 PM ogni giorno della settimana, la linea applicabile sarebbe 5 14 * * 1-5 osascript -e 'tell application "Mathematica" to quit'

  • osascript esegue Applescript dalla riga di comando, da un file o da una sola linea specificata (come stiamo facendo qui).

Aggiungere un lavoro cron

  1. Apri terminale
    • Opzionale: se non ti senti a tuo agio con il vim editor, cambia l'editor di shell in uno con cui ti trovi a tuo agio (suggerisco nano se non hai una preferenza) eseguendo il seguente comando: export EDITOR=nano (modificare nano al tuo editor preferito). Si noti che probabilmente si dovrebbero attenersi agli editor basati su shell, gli editor della GUI potrebbero non funzionare con le peculiarità di cron nel salvataggio dei file.
  2. genere crontab -e e premi invio per aprire il crontab nell'editor.
    • Ogni utente ha il proprio crontab e i comandi vengono eseguiti con le loro autorizzazioni, quindi dovresti farlo come qualsiasi utente che sta eseguendo Mathematica in primo luogo.
  3. Su una nuova riga (o sulla prima riga se non ci sono altre voci), inserisci il comando che abbiamo determinato in precedenza: 5 14 * * 1-5 osascript -e 'tell application "Mathematica" to quit'.
  4. Salva il file (control-O in nano) e chiudi il tuo editor.

Questo dovrebbe farlo. Ovviamente vorrai testarlo per assicurarti che non ci siano errori di formattazione nel tuo crontab, ma questo dovrebbe essere tutto ciò di cui hai bisogno per uscire da un programma.


Sembra un'alternativa robusta. Molto probabilmente una soluzione migliore a lungo termine. Voglio che Applesrcipt diventi più familiare con lui se non altro. Ancora fai un suggerimento intrigante. Grazie
Jagra
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.