2 votos

Quiero launchd para ejecutar una secuencia de comandos de semana, pero se ejecuta a diario en su lugar

Yo quería escribir un simple launchd trabajo que se ejecuta una secuencia de comandos cada lunes por la mañana a las 7:00 am. El objetivo es extraer una imagen de tapmusic.net que los catálogos de mi pasado.fm hábitos de escucha de la semana anterior. El demonio se ejecuta correctamente y es capaz de ejecutar la secuencia de comandos bien, y el script hace exactamente lo que yo quiero. El problema es que el trabajo se ejecute todos los días a la medianoche, no el lunes a las 7. Esta es mi primera vez tratando de salir algo como esto, y he intentado seguir las plantillas en developer.apple.com y flotando por la red, pero estoy realmente seguro de cómo puedo solucionar este problema. Aquí está el *.plist archivo que estoy corriendo:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>local.lastfm_chart</string>
        <key>Program</key>
        <string>/scripts/lastfm_chart.sh</string>
        <key>StartCalendarInterval</key>
        <dict>
            <key>Hour</key>
            <integer>7</integer>
            <key>Minute</key>
            <integer>0</integer>
            <key>Weekday</key>
            <integer>1</integer>
        </dict>
    </dict>
</plist>

Como he dicho, he sido capaz de cargar y ejecutar el trabajo igual de bien, sólo que no en el momento adecuado.

También, mi sistema.archivo de registro es conseguir bombardeado por un mensaje y se parece a esto:

Jun 15 08:54:46 ***-MBP com.apple.xpc.launchd[1] (local.lastfm_chart): Service only ran for 2 seconds. Pushing respawn out by 8 seconds.
Jun 15 08:54:57 ***-MBP com.apple.xpc.launchd[1] (local.lastfm_chart): Service only ran for 3 seconds. Pushing respawn out by 7 seconds.
Jun 15 08:55:07 ***-MBP com.apple.xpc.launchd[1] (local.lastfm_chart): Service only ran for 2 seconds. Pushing respawn out by 8 seconds.
Jun 15 08:55:45 --- last message repeated 2 times ---
Jun 15 08:55:45 ***-MBP com.apple.xpc.launchd[1] (local.lastfm_chart): Service only ran for 8 seconds. Pushing respawn out by 2 seconds.
Jun 15 08:55:50 ***-MBP com.apple.xpc.launchd[1] (local.lastfm_chart): Service only ran for 2 seconds. Pushing respawn out by 8 seconds.
Jun 15 08:56:12 --- last message repeated 1 time ---
Jun 15 08:56:12 ***-MBP com.apple.xpc.launchd[1] (local.lastfm_chart): Service only ran for 3 seconds. Pushing respawn out by 7 seconds.
Jun 15 08:56:34 --- last message repeated 1 time ---
Jun 15 08:56:34 ***-MBP com.apple.xpc.launchd[1] (local.lastfm_chart): Service only ran for 4 seconds. Pushing respawn out by 6 seconds.
Jun 15 08:56:43 ***-MBP com.apple.xpc.launchd[1] (local.lastfm_chart): Service only ran for 2 seconds. Pushing respawn out by 8 seconds.
Jun 15 08:57:07 --- last message repeated 1 time ---
Jun 15 08:57:07 ***-MBP com.apple.xpc.launchd[1] (local.lastfm_chart): Service only ran for 5 seconds. Pushing respawn out by 5 seconds.
Jun 15 08:57:15 ***-MBP com.apple.xpc.launchd[1] (local.lastfm_chart): Service only ran for 3 seconds. Pushing respawn out by 7 seconds.
Jun 15 08:57:25 ***-MBP com.apple.xpc.launchd[1] (local.lastfm_chart): Service only ran for 2 seconds. Pushing respawn out by 8 seconds.

No estoy seguro de lo que esto significa, ya sea.

Estoy en mojave 10.14.6, si lo que importa.

La adición de una edición para incluir el bash script que está siendo ejecutado:

#!/bin/sh


now=`date -v -7d +"%Y-%m-%d"`
curl "https://tapmusic.net/collage.php?user=gas_giant&type=7day&size=4x4&caption=true" -o /Users/****/Documents/Music/last.fm\ Listening\ Reports/tuneage_${now}.jpg

1voto

Tony Williams Puntos 4903

A partir de su registro parece que se ejecuta como un demonio, no un agente. El demonio está diseñado para funcionar constantemente, mientras que un agente sólo una vez.

Por lo que su .plist archivo debe estar en ~/Library/LaunchAgents. Una vez en ese directorio, a continuación, usted todavía tiene que cargarlo usando launchctl load <filename>.

También me pregunto si usted tiene un sobrante de proceso de un intento anterior ya que el registro es como haber KeepAlive set, pero no .plist. Por eso la mención de respawn.

A continuación, me preguntaba acerca de la ruta del script - es la ruta absoluta en realidad /scripts/lastfm.sh. Si usted está utilizando el Program clave en lugar de la ProgramArguments clave que tiene que ser una ruta de acceso absoluta.

Asumiendo que usted tiene no se carga en el espacio del Sistema, pero correctamente en tu espacio de usuario, a continuación, me gustaría empezar por echar un vistazo a lo launchctl piensa que está sucediendo detrás de las escenas.

  1. Encontrar su ID de usuario mediante la ejecución de id -u (la mía es de 502)
  2. Lista la información para su trabajo launchctl print gui/502/local.lastfm_chart

Esto incluirá un event triggers sección en la que se debe mostrar exactamente cuando launchctl piensa que se debe ejecutar el comando. También se mostrará el comando, si keepalive se establece y otra información útil.

Ah, y mantener el RunAtLoad menos que usted realmente quiere a RunAtLoad. La mejor manera de probar las cosas es para darle un kickstart - launchctl kickstart gui/502/local.lastfm_chart ejecutará el servicio.

Lo mismo es cierto con StandardErrorPath y StandardOutPath - en lugar de cambiar constantemente el .plist archivo que puede utilizar el launchctl debug comando para modificar estos una vez antes de kickstart, así:

  1. launchctl debug gui/502/local.lastfm_chart --stdout --stderr establecerá stdout y stderr a su sesión de terminal para la siguiente invocación del servicio.
  2. launchctl kickstart gui/502/local.lastfm_chart lo ejecuta con los ajustes y luego desaparecen.

0voto

Douglas Puntos 10417

El Calendario Intervalo se ve al revés. A empezar con el día y la hora. Se debe tener este aspecto:

<dict>
    <key>Weekday</key>
    <integer>1</integer>
    <key>Hour</key>
    <integer>7</integer>
    <key>Minute</key>
    <integer>00</integer>
</dict>

Usted también no desea que el "Ejecutar En la Carga" conjunto de valores, porque se va a ejecutar la secuencia de comandos en el momento en el plist se carga como en el momento de arranque o tras el inicio de sesión.

En cuanto a su guión va se ve bien. No hay nada en el que se trigger que se ejecute en un momento determinado, como la fecha en que la función sólo se utiliza para rellenar una variable que se utiliza en un nombre de archivo.

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