0 votos

MacOS - El demonio de inicio programado no se ejecuta

Estoy creando un demonio de lanzamiento en mi MacBook (con Monterrey instalado) para devolver el porcentaje de batería a la pantalla de bloqueo. Yo era capaz de elaborar el siguiente comando y ejecutarlo en la terminal sin ningún problema:

sudo defaults write /Library/Preferences/com.apple.loginwindow.plist LoginwindowText "Battery percentage: `pmset -g batt | perl -pe 's/.*?(\d+\%).*/$1/' | sed -n '2 p'`"

Para automatizar el comando (concretamente para que se ejecute cada minuto), he creado un archivo en /Library/LaunchDaemons llamado com.thecoder.lockscreenbattery.plist con el siguiente marcado:

<?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.thecoder.lockscreenbattery</string>

  <key>ProgramArguments</key>
  <array>
    <string>defaults write /Library/Preferences/com.apple.loginwindow.plist LoginwindowText "Battery percentage: `pmset -g batt | perl -pe 's/.*?(\d+\%).*/$1/' | sed -n '2 p'`"</string>
  </array>

  <key>RunAtLoad</key>
  <true/>

  <key>StartInterval</key>
  <integer>60</integer>
</dict>
</plist>

Finalmente, para iniciar el demonio, ejecuté el comando de Terminal sudo launchctl load /Library/LaunchDaemons/com.thecoder.lockscreenbattery.plist (También me aseguré de que el archivo tuviera permisos de ejecución para el usuario, el grupo y otros).

Sin embargo, el comando no se ejecuta como se supone cada minuto. De hecho, sólo se ejecuta cuando lo hago explícitamente en la Terminal. ¿Alguien tiene alguna idea de cómo puedo seguir solucionando esto? Muchas gracias de antemano.

2voto

Nate Puntos 220

Los elementos de ProgramArguments debe ser el programa a ejecutar (como un único <string> ), seguido de los argumentos que se le pasan (cada uno como un <string> ). Estás tratando de poner una línea de comandos de la shell, con múltiples programas, tuberías, citas, etc - ninguno de los cuales son compatibles aquí.

O bien poner el código del shell en un shell script (y poner la ruta al script como único elemento de ProgramArguments ), o pasarla a bash con el -c y dejar que lo analice:

  <key>ProgramArguments</key>
  <array>
    <string>bash</string>
    <string>-c</string>
    <string>defaults write /Library/Preferences/com.apple.loginwindow.plist LoginwindowText "Battery percentage: `pmset -g batt | perl -pe 's/.*?(\d+\%).*/$1/' | sed -n '2 p'`"</string>
  </array>

Por otra parte, cuando se trata de solucionar problemas con los trabajos de launchd, a menudo es útil capturar los mensajes de salida y de error del trabajo con la función StandardOutPath y StandardErrorPath llaves. Algo así como:

  <key>StandardOutPath</key>
  <string>/tmp/lockscreenbattery.out</string>
  <key>StandardErrorPath</key>
  <string>/tmp/lockscreenbattery.err</string>

... y luego examinar los resultados para ver lo que está sucediendo mientras el trabajo se ejecuta. (Nota: dado que este es un demonio de lanzamiento, no un agente, probablemente podría enviar la salida&errores a /var/log/ en lugar de /tmp/. Los agentes de lanzamiento no tendrían permiso para escribir allí).

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