6 votos

comando launchd run cada minuto de una hora específica

En man launchd.plist dice (el énfasis es mío)

StartCalendarInterval Esta clave opcional hace que el trabajo se inicie cada intervalo de calendario especificado. Los argumentos que faltan se consideran como comodines . La semántica es similar a la de crontab(5) en cuanto a la forma de especificar se especifican las fechas de disparo. Se pueden especificar múltiples diccionarios en un array para programar múltiples intervalos de calendario.

Mi archivo plist es /Users/enricozb/test.plist y contiene

<?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.enricozb.test</string>
    <key>ProgramArguments</key>
    <array>
        <string>date</string>
    </array>
    <key>StandardOutPath</key>
    <string>/Users/enricozb/test.txt</string>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>21</integer>
    </dict>
</dict>
</plist>

Observe que Hour se ajusta a 21 , es decir, a las 9 de la noche. Además, observe que el comando es básicamente date > /Users/enricozb/test.txt . Corrí

launchctl load /Users/enricozb/test.plist
launchctl start com.enricozb.test

Este fuego una vez justo después de la launchctl start comando, y nunca más.

Estaba asumiendo que como la documentación dice que los argumentos que faltan son comodines, que el Minute campo también sería comodín. ¿Por qué no se ejecuta cada minuto?

4voto

Joel Puntos 112

Editar inicio

Lo tienes todo correcto, excepto el hecho de adjuntar tu <dict> dentro de un elemento <array> elemento. Su script se ejecutará cada minuto desde las 21:00 hasta las 21:59 con lo siguiente como su StartCalendarInterval clave :

    <key>StartCalendarInterval</key>
    <array>
        <dict>
            <key>Hour</key>
            <integer>21</integer>
        </dict>
    </array>

Si quieres que tu script se ejecute cada minuto, cada hora, cada día, cada año, lo siguiente sería la sintaxis correcta (aunque ciertamente no obvia) para ello:

    <key>StartCalendarInterval</key>
    <array>
        <dict/>
    </array>

Mi respuesta original (abajo) también funcionaría, pero es claramente mucho más tediosa. Por otro lado, si uno necesitara cada otros minuto, o ciertos minutos, puede ser útil.

Editar el final


<key>StartCalendarInterval</key>
    <array>
        <dict>
            <key>Minute</key>
            <integer>0</integer>
        </dict>
        <dict>
            <key>Minute</key>
            <integer>1</integer>
        </dict>
        <dict>
            <key>Minute</key>
            <integer>2</integer>
        </dict>
        <dict>
            <key>Minute</key>
            <integer>3</integer>
        </dict>
        <dict>
            <key>Minute</key>
            <integer>4</integer>
        </dict>

       ... ad nauseum ...

        <dict>
            <key>Minute</key>
            <integer>59</integer>
        </dict>

    </array>

Para responder a su pregunta, "¿Por qué esto no funciona cada minuto?" es sólo porque no has adjuntado <dict> dentro de <array> . FWIW, también me parece muy extraño, y POR QUÉ está diseñado de esta manera es una respuesta que me gustaría escuchar yo mismo. Pero entonces supongo que Apple podría utilizar la defensa de que "sólo porque el semántica son similares no significa que la sintaxis lo sea".

2voto

moodforaday Puntos 2633

Creo que esto es un error en launchd .

Si saco el hora designación, se dispara cada minuto.

Pero si restrinjo el plist a sólo 9pm, entonces sólo se dispara una vez.

Actualización

Esto es lo que he probado (con la hora cambiada a '12' porque esa es la hora actual cuando intenté probarlo).

El archivo 'test.txt' nunca se crea.

<?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.everyminute</string>
    <key>Program</key>
    <string>/bin/date</string>
    <key>StandardOutPath</key>
    <string>/Users/tjluoma/Desktop/test.txt</string>
    <key>StartCalendarInterval</key>
    <array>
        <dict>
            <key>Hour</key>
            <integer>12</integer>
        </dict>
    </array>
</dict>
</plist>

Este hace crear/actualizar el archivo cada minuto

<?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.everyminute</string>
    <key>Program</key>
    <string>/bin/date</string>
    <key>StandardOutPath</key>
    <string>/Users/tjluoma/Desktop/test.txt</string>
    <key>StartCalendarInterval</key>
    <array>
        <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