Internet, Informática y Tecnología

Solución: systemd-run no se ejecuta correctamente en Cron

systemd-run help

En sistemas como Debian y Ubuntu contamos con la herramienta systemd-run, que forma parte del sistema de systemd. Una de las características de esta herramienta es la capacidad de controlar y limitar recursos del sistema con cuotas y límites para cada servicio ejecutado. Existen varias formas de ejecutar systemd-run, pero el motivo principal de esta entrada es para esas ocasiones en las que no se ejecuta al utilizar cron, ya que como muchos sabrán depurar tareas en cron es una tarea tediosa y algo complicada.

Problema

Estuve utilizando systemd-run para ejecutar tareas como backups y servicios cron de aplicaciones web que en la terminal funcionaban correctamente, pero al revisar los registros estos no se estaban ejecutando desde el cron del sistema. 
Utilicé systemd-run en varios modos de ejecución con una variación de los parámetros y no funcionaba. Estuve intentando ejecutar las tareas con límite de CPU por porcentaje y límite de IO. Hasta aquí todo parecía normal, el problema es, ¿cómo es posible que si una tarea se ejecute correctamente en la terminal, y en cron falla de forma silenciosa?

Solución

Con un poco de depuración adicional, al revisar syslog miré que el registro de los comandos estaba incompleto, prácticamente estaban a la mitad, y esto fue lo que me ayudo a encontrar el problema. En sí no había ninguna descripción real de un problema, era como si ejecutara medio comando en el cron.

Entonces comprendí que cuando usamos símbolos de porcentajes en las tareas que se encuentren en cron deben escaparse, y en este caso estaba usando el símbolo de porcentaje para el límite de CPU en systemd-run.

Este es un ejemplo de mi tarea programada cuando fallaba de forma silenciosa.

30 */2 * * * /usr/bin/systemd-run --setenv=HOME=/root --nice 19 --pipe -p CPUQuota=70% …

Para escapar el símbolo de porcentaje simplemente agregué una diagonal invertida antes del símbolo.

30 */2 * * * /usr/bin/systemd-run --setenv=HOME=/root --nice 19 --pipe -p CPUQuota=70\% …

De esta manera todo empezó a funcionar con normalidad. El problema aquí era que yo desconocía que era necesario escapar ciertos caracteres en las listas de tareas programadas de cron.

Conclusión

Parece algo sencillo, pero un pequeño error como este puede quitarnos días productivos y convertirlos en dolores de cabeza. Puede ser que me haya pasado porque nunca había tenido la necesidad de usar caracteres especiales en un cron, o tal vez me falta leer la documentación de cron adicional a la documentación de systemd-run, que por supuesto le di varias vueltas al tratar de encontrar el error.

Categorías

Contenido relacionado