8 votos

formato plist de launchd para ejecutar un comando a una hora determinada en un día de la semana

Estoy tratando de ejecutar un comando a los 10 minutos después de las 2 de la mañana todos los días de la semana solamente. En mi launchd .plist ¿cómo puedo especificar esto?

No quiero que se ejecute cada 2 horas y 10 minutos, sólo una vez cada día de la semana a la hora especificada.

15voto

Douglas Puntos 10417

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

  1. Cada día de la semana debe ser una entrada especificada en un lugar en el StartCalendarInterval entrada del diccionario.
  2. Los días laborables van de 1 a 5. Los domingos van del 0 al 7 (lo sé, ¿verdad?)
  3. Tienes que saber cómo quieres que funcione tu artículo y colocar el .plist en los directorios/carpetas correspondientes:
    1. ~/Library/LaunchAgents - Específico para el usuario. Se ejecutará cuando el usuario esté conectado.
    2. /Library/LaunchAgents - Específico para todos los usuarios. Se ejecutará cuando el usuario(s) esté(n) conectado(s).
    3. /Library/LaunchDaemons - Se ejecuta independientemente de si el usuario(s) está(n) conectado(s). Debe utilizar sudo para cargar .plist

Mi preferencia es #3 (cargar como un LaunchDaemon) para que mi script se ejecute tanto si estoy conectado como si no. Cuando se utiliza como un LaunchDameon, debe utilizar sudo para cargar el .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 pueda surgir y mantiene la convención de nombres de Apple de com.apple.some-app.plist Esto es totalmente opcional por su parte.

A continuación se muestra un script que estoy utilizando para limpiar los archivos de trabajo (lo he modificado para sus parámetros de tiempo específicos). Puedes editar este archivo con tu editor de texto favorito (yo uso Komodo Edit ), pero TextEdit o incluso nano o vi desde la línea de comandos 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>

Película de bonificación....

La siguiente parte es opcional...

Para poder obtener alguna información de que mis scripts se ejecutaron y cuál fue el resultado, creé una pequeña función AppleScript que invoca el 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 script, compruebo el éxito o el fracaso, dependiendo de lo que sea (es decir, un archivo existente en un directorio 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

Esta es la muestra de la salida:

enter image description here

2voto

user3439894 Puntos 5883

He aquí un ejemplo .plist archivo 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 quiere escribir a mano el launchd .plist un programa como Lingon X puede ser bastante útil ya que facilitará la carga/descarga del .plist también.

2voto

yoliho Puntos 340

El comando que necesita es Start CalendarInterval

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

Este ejemplo ejecuta /usr/bin/env a la hora que quieras. No hay un atajo para todos los días de la semana, así que tienes que listar los días en 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>

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