Files
obsidian-vault/005-Learn/Instructivo launchd iOS.md

2.9 KiB

Instructivo: Ejecutar un servicio Python con launchd en macOS

Objetivo

Ejecutar un servicio de Python de forma automática utilizando launchd.

Estructura sugerida

/Users/george/services/sap_sunat/
    .venv/
    main.py
    config.ini
    logs/
        stdout.log
        stderr.log

Verificar el entorno virtual

Activar:

source .venv/bin/activate

Obtener el intérprete:

which python

Usar esa ruta en ProgramArguments.

Archivo .plist

Ubicación recomendada para un usuario:

~/Library/LaunchAgents/com.george.sap.sunat.plist

Claves habituales:

  • Label
  • ProgramArguments
  • WorkingDirectory
  • RunAtLoad
  • KeepAlive
  • StandardOutPath
  • StandardErrorPath

Comentarios

Se permiten comentarios XML:

<!-- Comentario -->

También se pueden comentar bloques completos de claves.

Cargar el servicio

launchctl load ~/Library/LaunchAgents/com.george.sap.sunat.plist

En versiones recientes también:

launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.george.sap.sunat.plist

Verificar

launchctl list | grep sap

Información detallada:

launchctl print gui/$(id -u)/com.george.sap.sunat

Detener

launchctl unload ~/Library/LaunchAgents/com.george.sap.sunat.plist

o

launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.george.sap.sunat.plist

Monitorización

Monitor de Actividad: - Buscar python o python3.

Terminal:

ps -ef | grep python

Consumo:

ps -o pid,rss,vsz,%cpu,command -p <PID>

Ver logs:

tail -f logs/stdout.log
tail -f logs/stderr.log

Recomendaciones

  • Usar logging con rotación.
  • Manejar reconexión a SAP HANA.
  • Implementar reintentos para SUNAT.
  • Mantener configuración en config.ini o .env.
  • Capturar SIGTERM para cerrar conexiones correctamente.
  • Si el servicio es permanente, controlar internamente la frecuencia de ejecución (cada 10 s entre 06:00 y 13:15; cada 30 min entre 13:15 y 14:00).

Ejemplo de archivo .plist

<?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.george.sap.sunat</string>

    <key>ProgramArguments</key>
    <array>
        <string>/Users/george/services/sap_sunat/.venv/bin/python</string>
        <string>/Users/george/services/sap_sunat/main.py</string>
    </array>

    <key>WorkingDirectory</key>
    <string>/Users/george/services/sap_sunat</string>

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

    <key>KeepAlive</key>
    <true/>

    <key>StandardOutPath</key>
    <string>/Users/george/services/sap_sunat/logs/stdout.log</string>

    <key>StandardErrorPath</key>
    <string>/Users/george/services/sap_sunat/logs/stderr.log</string>

</dict>
</plist>