0 votos

El agente de lanzamiento lanza mi tarea cada 10 segundos a pesar de que el archivo StartInterval está establecido en 60

Quiero ejecutar un script cada 60 segundos. Hice un archivo .plist como el siguiente

<?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>KeepAlive</key>
    <true/>
    <key>Label</key>
    <string>info.hotoku.launch-sample</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/hotoku/projects/hotoku/launch-sample/run</string>
    </array>
    <key>StandardErrorPath</key>
    <string>/Users/hotoku/projects/hotoku/launch-sample/stderr</string>
    <key>StandardOutPath</key>
    <string>/Users/hotoku/projects/hotoku/launch-sample/stdout</string>
    <key>WorkingDirectory</key>
    <string>/Users/hotoku/projects/hotoku/launch-sample</string>
    <key>StartInterval</key>
    <integer>60</integer>
  </dict>
</plist>

El contenido del script especificado es el siguiente:

#!/bin/bash

echo [$(date +"%Y-%m-%d %H:%M:%S")] run

Es decir, el script sólo emite el tiempo de ejecución a su stdout (por supuesto, esto es un ejemplo).

Puse el archivo .plist en mi ~/Library/LaunchAgent . Esperar varios minutos y comprobar el contenido de StandardOutPath tengo esto.

$ cat /Users/hotoku/projects/hotoku/launch-sample/stdout
[2022-02-01 09:13:55] run
[2022-02-01 09:14:05] run
[2022-02-01 09:14:15] run
[2022-02-01 09:14:25] run
[2022-02-01 09:14:35] run
[2022-02-01 09:14:46] run
[2022-02-01 09:14:56] run
[2022-02-01 09:15:06] run
[2022-02-01 09:15:16] run
[2022-02-01 09:15:26] run

Parece que mi agente de lanzamiento se lanza cada 10 segundos aunque el valor del intervalo de inicio sea 60.

¿Puede alguien solucionar el problema?

2voto

Nate Puntos 220

Esto se debe a la <key>KeepAlive</key><true/> en el archivo .plist, que le dice a launchd que reinicie automáticamente el programa si/cuando sale. a launchd no le gusta reiniciar las cosas con demasiada frecuencia, por lo que por defecto se "aceleran" los reinicios a cada 10 segundos (que es lo que estás viendo). Usted puede establecer la clave para <false/> o simplemente eliminarlo por completo (por defecto es falso).

Si quiere que el trabajo se reinicie bajo ciertas condiciones, puede especificar una serie de condiciones en las que debe reiniciarse. Por ejemplo, para reiniciar el trabajo si sale con un estado de error, podría utilizar esto:

<key>KeepAlive</key>
<dict>
    <key>SuccessfulExit</key>
    <false/>
</dict>

(En este caso, <key>SuccessfulExit</key><false/> significa esencialmente "si no sale con éxito").

BTW, sé que script es sólo un stub para probar cómo se ejecuta el trabajo, pero me he dado cuenta de un error. Desde [$(date +"%Y-%m-%d %H:%M:%S")] no está entre comillas, el intérprete de comandos intentará "expandirlo" en una lista de nombres de archivo que coincidan. Es decir, [2022-02-01 09:13:55] buscaría archivos con nombres como "2", "0", etc. y si encuentra alguno reemplazaría esa expresión de corchetes con los nombres que coincidan. Así que si usted obtiene una salida como esta:

2 run
2 run
2 run
...etc

Esto significa que hay un archivo llamado "2" en el directorio de trabajo del agente (probablemente su directorio personal). Deberías ponerlo entre comillas, o simplemente incluirlo todo en el archivo date cadena de formato (de nuevo, debidamente entrecomillada):

date +"[%Y-%m-%d %H:%M:%S] run"

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