Applescript per spegnere Mathematica in un momento specifico della giornata

3

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

Icomputersiavvianoinunmomentospecifico,MathematicaeunospecificotaccuinoMathematicavengonolanciatievalutati.QuindihobisognodiusciredaMathematicaalivellodiprogrammazioneelasciarecheiprogrammirilevantichiudanoicomputer.HoelaboratotuttoquitranneilpassaggioevidenziatoperusciredaMathematicaconun'applicazioneApplescript.

PercominciarehocreatounasempliceapplicazioneusandoilEditordiApplescript:

tellapplication"Mathematica" to quit

Questo spegnerà Mathematica se il taccuino aperto è stato salvato e il notebook lo fa da sé. 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 che spegnerà Mathematica in un momento specifico solo nei giorni feriali?

Questi ultimi funzionerebbero meglio per me in quanto penso che avrei meno conflitti se chiudessi Mathematica in un momento specifico piuttosto che dopo un certo periodo di tempo.

    
posta Jagra 17.07.2012 - 20:24
fonte

3 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"
    
risposta data 18.07.2012 - 05:35
fonte
4

Ok, ecco come fare a lanciare l'esecuzione alle 2:05 pm

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>

Tieni presente che devi eseguire il logout / login o utilizzare launchctl load ~/Library/LaunchAgents/com.tjluoma.quit-at-time.plist

Ora, la riga /usr/local/bin/killMathematica.sh potrebbe puntare a 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 rendilo chmod 755

Provalo e vedi se funziona.

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

Ecco una soluzione migliore: utilizza Keyboard Maestro . È molto più semplice.

Quanto è facile?

link

Boom. Fatto.

Nessun lancio. Nessun cron. No AppleScript.

(Dovevo usare VLC invece di Mathematica perché non avevo installato Mathematica.)

    
risposta data 18.07.2012 - 01:58
fonte
2

La versione tl; dr

  1. Esegui crontab -e nel Terminale.
  2. Incolla in 5 14 * * 1-5 osascript -e 'indica all'applicazione "Mathematica" di uscire' su una nuova riga.
  3. Salva.

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 , che può eseguire comandi su una pianificazione prestabilita. OS X ha anche launchd , ma questo è un 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, nella forma 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 solo verrà eseguito venerdì 13, non tutti i venerdì e ogni 13 del mese).
    • I giorni della settimana vanno da 0 a 7, con 0 e 7 che indicano domenica.

Esempi

0 15 * * 1-5 /usr/bin/blah esegue /usr/bin/blah alle 3 PM 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.

La tua specifica cron entry

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

  • osascript esegue Applescript dalla riga di comando, sia da un file, sia da un liner che si specifica (come stiamo facendo qui).

Aggiunta di un cron job

  1. Apri terminale
    • Facoltativo: se non ti senti a tuo agio con l'editor vim , modifica l'editor di shell con uno che ti piace (suggerisco nano se non hai una preferenza) eseguendo il seguente comando: export EDITOR=nano (cambia nano nell'editor preferito). Nota che probabilmente dovresti attenersi agli editor basati su shell, gli editor della GUI potrebbero non funzionare con le peculiarità di cron nel salvataggio dei file.
  2. Digita crontab -e e premi invio per aprire 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 l'editor.

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

    
risposta data 17.07.2012 - 21:59
fonte

Leggi altre domande sui tag