Ejecutar procesos en segundo plano de manera controlada: systemd-run vs nohup vs tmux/screen
Si estamos conectados por ssh y sufrimos una desconexión mientras ejecutamos un comandos, puede representar un problema, desde la interrupción del proceso o la pérdida del acceso a la salida estándar/error del mismo. Existen comandod como nohup que de alguna manera nos ayudan a mitigar esas situaciones, tales como nohup, o multiplexores de terminal como screen y tmux.
Al usar systemd, contamos con una herramienta tan sencilla como poderosa: el comando systemd-run
que permite ejecutar un comando muy sencillo como el siguiente en un servicio. O para ser más exactos en una service unit:
systemd-run --user ping 8.8.8.8
Comparación con nohup, tmux/screen
Característica | systemd-run |
nohup |
tmux / screen
|
---|---|---|---|
Supervisión del estado | Sí, vía systemctl status y journalctl
|
No, se debe usar ps o pgrep
|
Parcial, requiere inspección manual de la sesión |
Control del ciclo de vida | Completo: iniciar, detener, reiniciar con políticas de reinicio | Nulo: solo iniciar, sin reinicio automático | Manual: requiere interacción del usuario |
Manejo de logs | Centralizado en journal, con metadata y timestamps | Básico: redirige a nohup.out sin rotación |
Opcional: solo si se configura logging explícitamente |
Integración con el sistema | Alta: como unidad de systemd, con cgroup, slices, y logs centralizados | Nula: proceso genérico del usuario | Baja: proceso de usuario sin integración con systemd |
Persistencia tras logout | Alta: configurable vía lingering o como unidad del sistema |
Limitada: depende de configuración de logind
|
Alta (tradicional), pero afectada por KillUserProcesses
|
Persistencia tras reinicio | Posible mediante conversión a unidad persistente o uso de systemd-timer
|
No, se requiere cron, scripts externos | No, sesión se pierde tras reboot |
Políticas de recursos/aislamiento | Completa: límites CPU, memoria, I/O, namespaces, privilegios, etc. | Nula: se requiere uso externo de ulimit o nice
|
Nula: requiere herramientas externas |
Facilidad de uso interactivo | Baja: orientado a ejecución no interactiva | Nula: no interactivo | Alta: diseñado para interacción, múltiples ventanas/sesiones |
Ideal para | Tareas ad-hoc, servicios temporales, pruebas controladas | Procesos simples que deben continuar tras logout | Tareas interactivas largas o sesiones remotas persistentes |
Más Ejemplos
Ansible
Advertencia: Los siguiente comandos no son para copiar y pegar sin analizarlos, deben ser ajustados al entorno en los cuales se los desea utiizar. El propósito principal es mostrar la potencia práctia de la herramienta systemd-run
.
Objetivo: Ejecutar playbooks críticos en entornos controlados, como servicios temporales autoreiniciables.
systemd-run -p Restart=on-failure -p PrivateTmp=yes -p Description="Provisionar servidores" \ -p SuccessExitStatus=0 \ -p RestartSec=5 \ -p TimeoutStopSec=30 \ --unit=ansible-run ansible-playbook site.yml -i inventory/prod
Ventajas:
- Crea un entorno temporal (
/tmp
aislado). - Si falla, se reinicia automáticamente.
- El log de toda la ejecución queda en
journal
.
mysqldump
Objetivo: Realizar dumps de bases de datos con límites de memoria y sin cargar el sistema.
systemd-run \ -p MemoryMax=750M \ -p MemorySwapMax=150M \ -p Nice=10 \ -p Description="Backup de MySQL sin afectar el sistema" \ --unit=mysql-dump \ bash -c 'mysqldump --all-databases > /tmp/backup.sql'
Ventajas:
- Protege al sistema de un uso excesivo de memoria
- Alta prioridad de batch (
Nice=10
). - Log y control vía systemd.
Azure CLI
Objetivo: Apagar/desasignar todas las VMs del grupo "GrupoDesarrollo" en segundo plano
systemd-run --unit=apagar_vms \ --service-type=oneshot \ -p WorkingDirectory=/tmp \ bash -c 'az login --identity && az vm list -g GrupoDesarrollo --query "[].id" -o tsv | xargs -r az vm deallocate --ids'
Ventajas:
- Ejecución desacoplada de la terminal.
- Se puede usar
journalctl
para auditar el comando. - Control sobre el entorno de ejecución
Conclusión
El comando systemd-run
es una alternativa más robusta que otros comandos legacy o multiplexores de terminal, ya que permite, no solamente desacoplar el proceso de la terminal sino también poder gestionarlo perfectamente dentro de systend.
Fuentes y más recursos
-
Manpage de
systemd-run
Documentación oficial desystemd-run
, incluyendo parámetros como--unit
,--service-type
, y ejemplos útiles. -
Manpage de
systemd.service
Referencia esencial sobre unidades de servicio, incluyendo tipos (oneshot
,simple
) y propiedades comoRestart=
,WorkingDirectory=
, etc. -
Autenticación con identidad administrada en Azure CLI
Cómo usaraz login --identity
de forma segura, sin almacenar credenciales. -
Respuesta que recomienda
systemd-run
cuandonohup
falla
Explica por qué procesos protegidos connohup
pueden morir y proponesystemd-run --scope --user
como solución más fiable. -
Explicación de tipos de unidades systemd (Fedora Project)
Introducción accesible al funcionamiento de systemd.
Comentarios
Comments powered by Disqus