launchd plist format per eseguire un comando in un momento specifico in un giorno della settimana

4

Sto cercando di eseguire un comando a 10 minuti dopo le 2:00 solo nei giorni feriali. Nel mio file launchd .plist , come posso specificarlo?

Non voglio che venga eseguito ogni 2 ore e 10 minuti, solo una volta ogni giorno della settimana all'ora specificata.

    
posta andrewz 15.08.2016 - 16:44
fonte

3 risposte

9

Ci sono alcune avvertenze con la creazione di file launchd .plist. Li riepiloghiamo qui sotto:

  1. Ogni Weekday deve essere una voce specificata in un posto nella voce del dizionario StartCalendarInterval .
  2. I giorni della settimana vanno da 1 a 5. La domenica è 0 e 7 (lo so, giusto?)
  3. Devi sapere come vuoi che il tuo articolo venga eseguito e posizionare il .plist nelle directory / cartelle appropriate:
    1. ~/Library/LaunchAgents - Specifico per l'utente. Verrà eseguito quando l'utente ha effettuato l'accesso.
    2. /Library/LaunchAgents : specifico per tutti gli utenti. Verrà eseguito quando l'utente è (sono) loggato.
    3. /Library/LaunchDaemons - Esegue indipendentemente se l'utente è (sono) loggato. Deve usare sudo per caricare .plist

La mia preferenza è # 3 (carica come LaunchDaemon), quindi il mio script verrà eseguito indipendentemente dal fatto che io abbia effettuato l'accesso o meno. Quando utilizzi come LaunchDameon, devi utilizzare sudo per caricare .plist :

sudo lauchctl load com.user.fileCleanup.plist

Nota: per quanto riguarda la convenzione di denominazione nel mio esempio, mi piace usare com.user.< name of my script >.plist Questo mi aiuta a identificare e correggere eventuali problemi che dovessero insorgere e mantenere con la convenzione di denominazione Apple di com.apple.some-app.plist Questo è completamente opzionale sul tuo parte.

Di seguito c'è uno script che sto usando per ripulire i file di lavoro (l'ho modificato per i tuoi specifici parametri temporali). Puoi modificare questo file con il tuo editor di testo preferito (io uso Komodo Edit ), ma TextEdit o anche nano o vi dalla riga di comando funzionerà.

<?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.user.fileCleanup</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/allan/Documents/Scripts/Unix/fileCleanup.sh</string>
    </array>
    <key>StartCalendarInterval</key>
    <!--  Weekdays are 1 - 5; Sunday is 0 and 7   -->
    <array>
        <dict>
            <key>Weekday</key>
            <integer>1</integer>
            <key>Hour</key>
            <integer>2</integer>
            <key>Minute</key>
            <integer>10</integer>
        </dict>
        <dict>
            <key>Weekday</key>
            <integer>2</integer>
            <key>Hour</key>
            <integer>2</integer>
            <key>Minute</key>
            <integer>10</integer>
        </dict>
        <dict>
            <key>Weekday</key>
            <integer>3</integer>
            <key>Hour</key>
            <integer>2</integer>
            <key>Minute</key>
            <integer>10</integer>
        </dict>
        <dict>
            <key>Weekday</key>
            <integer>4</integer>
            <key>Hour</key>
            <integer>2</integer>
            <key>Minute</key>
            <integer>10</integer>
        </dict>
        <dict>
            <key>Weekday</key>
            <integer>5</integer>
            <key>Hour</key>
            <integer>2</integer>
            <key>Minute</key>
            <integer>10</integer>
        </dict>
    </array>

</dict>
</plist>

Metraggio bonus ....

Questa prossima parte è facoltativa ...

In modo che possa ottenere un feedback che i miei script siano eseguiti e quale sia il risultato, ho creato una piccola funzione AppleScript che richiama display notification (è abbastanza semplice per le mie esigenze, ma ovviamente potrebbe essere migliorata).

on run argv

    set Message to item 1 of argv
    set Title to item 2 of argv
    set aud to item 3 of argv
    set STitle to "Terminal"
    set Snd to "Blow.aiff"


    if (aud = "sound") then

        display notification Message with title Title subtitle STitle sound name Snd
    else
        display notification Message with title Title subtitle STitle
    end if

end run

All'interno del mio script, cerco il successo o il fallimento, a seconda di cosa sia (cioè un file esistente in una particolare directory), genererà una notifica. In caso contrario, un'altra notifica, ma questa volta con audio!

#!/bin/bash
if [ -f "$SOURCE" ]
then
    scp -q "$SOURCE" "$TARGET"
    osascript $ASCRIPT_DIR/notify.scpt "Podcast Transfered successfully" "$TITLE -- SUCCESS" "nosound"
else
    osascript $ASCRIPT_DIR/notify.scpt "The file $TARGET does not exist" "$TITLE -- ERROR" "sound"
fi

Ecco l'output di esempio:

    
risposta data 15.08.2016 - 17:07
fonte
2

Ecco un esempio di file .plist per coprire l'esecuzione alle 2:10 di ogni giorno della settimana.

<?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.me.hello</string>
    <key>ProgramArguments</key>
    <array>
        <string>say</string>
        <string>hello</string>
    </array>
    <key>RunAtLoad</key>
    <false/>
    <key>StartCalendarInterval</key>
    <array>
        <dict>
            <key>Hour</key>
            <integer>2</integer>
            <key>Minute</key>
            <integer>10</integer>
            <key>Weekday</key>
            <integer>1</integer>
        </dict>
        <dict>
            <key>Hour</key>
            <integer>2</integer>
            <key>Minute</key>
            <integer>10</integer>
            <key>Weekday</key>
            <integer>2</integer>
        </dict>
        <dict>
            <key>Hour</key>
            <integer>2</integer>
            <key>Minute</key>
            <integer>10</integer>
            <key>Weekday</key>
            <integer>3</integer>
        </dict>
        <dict>
            <key>Hour</key>
            <integer>2</integer>
            <key>Minute</key>
            <integer>10</integer>
            <key>Weekday</key>
            <integer>4</integer>
        </dict>
        <dict>
            <key>Hour</key>
            <integer>2</integer>
            <key>Minute</key>
            <integer>10</integer>
            <key>Weekday</key>
            <integer>5</integer>
        </dict>
    </array>
</dict>
</plist>

Se non vuoi scrivere a mano il file launchd .plist , un programma come Lingon X può essere abbastanza utile in quanto faciliterà anche il caricamento / lo scaricamento del file .plist .

    
risposta data 15.08.2016 - 16:57
fonte
2

Il comando che ti serve è Start CalendarInterval

Il modo semplice è utilizzare un programma come LaunchControl o Lingon per scrivere e caricare il plist.

Questo esempio esegue / usr / bin / env nel momento desiderato. Non esiste una scorciatoia per tutti i giorni della settimana, quindi devi elencare i giorni che la domenica è 0. Ho mostrato lunedì e martedì come esempio

<?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>local.job</string>
    <key>Program</key>
    <string>/usr/bin/env</string>
    <key>StartCalendarInterval</key>
    <array>
        <dict>
            <key>Hour</key>
            <integer>2</integer>
            <key>Minute</key>
            <integer>10</integer>
            <key>Weekday</key>
            <integer>1</integer>
        </dict>
        <dict>
            <key>Hour</key>
            <integer>2</integer>
            <key>Minute</key>
            <integer>10</integer>
            <key>Weekday</key>
            <integer>2</integer>
        </dict>
    </array>
</dict>
</plist>
    
risposta data 15.08.2016 - 17:09
fonte

Leggi altre domande sui tag