2.9 KiB
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:
LabelProgramArgumentsWorkingDirectoryRunAtLoadKeepAliveStandardOutPathStandardErrorPath
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
loggingcon rotación. - Manejar reconexión a SAP HANA.
- Implementar reintentos para SUNAT.
- Mantener configuración en
config.inio.env. - Capturar
SIGTERMpara 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>