9 votos

¿Puedo hacer que launchctl emita stdout/stderr desde mi aplicación al mecanismo de registro unificado de todo el sistema?

He configurado un .plist en ~/Library/LaunchAgents para ejecutar un proceso ( offlineimap ) de forma periódica. He especificado tanto el StandardOutPath y StandardErrorPath para que apunten a los archivos de mi directorio personal, lo cual funciona. Sin embargo, esto no proporciona realmente una solución completa de registro de lo que puedo ver. Los registros no se rotan, no hay marcas de tiempo (abordado por esta pregunta (aunque no hubo una respuesta clara), y el registro no está integrado en ningún otro registro del sistema. Creo que preferiría que los registros fueran a Registro unificado .

Estoy acostumbrado al registro de systemd en Linux, que es un mecanismo similar, y sería genial si hubiera una forma similar de redirigir esa salida al registro de todo el sistema, visible con el log de la orden. ¿Hay alguna forma de hacerlo con un LaunchAgent personalizado?

Debo añadir que estoy usando MacOS 10.14.5.

4voto

Phill Puntos 126

Puede utilizar blowhole .

blowhole es una herramienta de línea de comandos que toma una cadena como argumento y la envía al sistema de registro unificado . Es compatible desde Sierra (10.12) hasta Catalina (10.15).

Cómo utilizarlo

(Probado en MacOS Catalina 10.15.5)

Modificar el ProgramArguments matriz en su .plist archivo como este:

<key>ProgramArguments</key>
<array>
    <string>/bin/bash</string>
    <string>-c</string>
    <string>COMMAND OPTIONS 2> >(while read; do /path/to/blowhole -e "$REPLY"; done) | while read; do /path/to/blowhole -d "$REPLY"; done</string>

donde COMMAND OPTIONS es el comando que desea ejecutar, seguido de las opciones que desee.

Aquí, hago uso de bash El apoyo de la Comisión a redirección ( 2> ), sustitución de procesos ( >() ) y tuberías ( | ) a:

  • ordenar el error estándar y la salida estándar del comando
  • procesarlos por separado dentro de dos while bucles. El primer while El bucle se ejecuta blowhole -e para registrar el error estándar con un nivel de "Error":

    <timestamp> Error <info> blowhole: [co.eclecticlight.blowhole:general] Blowhole: STANDARD ERROR MESSAGES

    y el segundo corre blowhole -d para registrar la salida estándar con un nivel "predeterminado":

    <timestamp> Default <info> blowhole: [co.eclecticlight.blowhole:general] Blowhole: STANDARD OUTPUT MESSAGES

    (Ya que blowhole no puede leer de la entrada estándar, necesitamos while bucles para alimentar una línea de entrada a la vez).

El blowhole: [co.eclecticlight.blowhole:general] Blowhole: no es configurable, pero puede añadir un prefijo de su elección a los mensajes registrados. Por ejemplo, ya que menciona offlineimap en su pregunta:

/path/to/blowhole -d "offlineimap stdout: $REPLY";

y:

/path/to/blowhole -e "offlineimap stderr: $REPLY";

Puede leer las entradas del registro con sudo log show | grep blowhole:general o sudo log show | grep offlineimap , si ha añadido el prefijo personalizado. Para leer las entradas de registro a medida que se generan, de forma similar a tail -f Utilizar show stream en su lugar.

Alternativamente puede envolver el comando que desea ejecutar en un shell script para que blowhole registra la salida estándar y el error del comando de forma similar a la anterior. Esto es conveniente si desea ejecutar algún código antes de ejecutar el comando real:

#!/bin/bash
# Add the code you want to execute prior to the actual command here
COMMAND ARGUMENTS \
> >(
while read; do 
    /path/to/blowhole -d "$REPLY"; 
done) \
2> >(
while read; do 
    /path/to/blowhole -e "$REPLY"; 
done)

A continuación, puede configurar el ProgramArguments de su .plist para ejecutar el script en lugar de su comando:

<key>ProgramArguments</key>
<array>
    <string>/bin/bash</string>
    <string>/path/to/script.sh</string>
</array>

Dónde conseguirlo

Puede descargar blowhole de su página de proyectos o directamente desde aquí . El programa se suministra como un ejecutable firmado, reforzado y notariado (como exige Catalina) y como un paquete instalador.

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