launchd plist formato para ejecutar un comando en un momento específico en un día laborable

4

Estoy intentando ejecutar un comando 10 minutos después de las 2 a.m., solo los días laborables. En mi archivo launchd .plist , ¿cómo puedo especificar esto?

No quiero que se ejecute cada 2 horas y 10 minutos, solo una vez cada día laborable a la hora especificada.

    
pregunta andrewz 15.08.2016 - 16:44

3 respuestas

9

Hay algunas advertencias con la creación de archivos .plist de launchd. Los resumiré a continuación:

  1. Cada día laborable debe ser una entrada especificada en una entrada del diccionario StartCalendarInterval .
  2. Los días de la semana van de 1 a 5. El domingo es 0 y 7 (lo sé, ¿verdad?)
  3. Debe saber cómo desea que se ejecute su elemento y colocar el .plist en los directorios / carpetas apropiados:
    1. ~/Library/LaunchAgents - Específico para el usuario. Se ejecutará cuando el usuario haya iniciado sesión.
    2. /Library/LaunchAgents - Específico para todos los usuarios. Se ejecutará cuando el (los) usuario (s) esté (n) conectado (s).
    3. /Library/LaunchDaemons : se ejecuta independientemente de que los usuarios hayan iniciado sesión. Debe usar sudo para cargar .plist

Mi preferencia es # 3 (cargar como LaunchDaemon) por lo que mi script se ejecutará independientemente de que haya iniciado sesión o no. Cuando se utiliza como LaunchDameon, debe usar sudo para cargar .plist :

sudo lauchctl load com.user.fileCleanup.plist

Nota: En cuanto a la convención de nombres en mi ejemplo, me gusta usar com.user.< name of my script >.plist . Esto me ayuda a identificar y depurar cualquier problema que surja y se mantiene con la convención de nombres de Apple de com.apple.some-app.plist . Esto es completamente opcional en su parte.

A continuación hay un script que estoy usando para limpiar archivos de trabajo (lo modifiqué para tus parámetros de tiempo específicos). Puedes editar este archivo con tu editor de texto favorito (uso Komodo Edit ), pero TextEdit o incluso nano o vi de la línea de comando funcionará.

<?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>

Imágenes de bonificación ....

La siguiente parte es opcional ...

Para poder obtener información de que mis scripts se ejecutaron y cuál fue el resultado, creé una pequeña función AppleScript que invoca a display notification (es bastante simple para mis necesidades, pero obviamente podría mejorarse).

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

Dentro de mi secuencia de comandos, verifico el éxito o el fracaso, según lo que sea (es decir, un archivo existente en un directorio en particular), generará una notificación. Si no, otra notificación, pero esta vez con sonido!

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

Aquí está la salida de muestra:

    
respondido por el Allan 15.08.2016 - 17:07
2

Aquí hay un ejemplo de archivo .plist para cubrir la ejecución a las 2:10 AM todos los días de la semana.

<?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>

Si no desea escribir a mano el archivo launchd .plist , un programa como Lingon X puede ser muy útil ya que facilitará la carga / descarga del archivo .plist también.

    
respondido por el user3439894 15.08.2016 - 16:57
2

El comando que necesitas es Start CalendarInterval

La forma más fácil es usar un programa como LaunchControl o Lingon para escribir y cargar el plist.

Este ejemplo ejecuta / usr / bin / env en el momento que desee. No hay un acceso directo para todos los días de la semana, por lo que debe indicar los días que el domingo es 0. He mostrado el lunes y el martes como ejemplo

<?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>
    
respondido por el Mark 15.08.2016 - 17:09

Lea otras preguntas en las etiquetas