El informe del lunes que nadie lanzó
Un restaurante quiere recibir el informe de ventas cada lunes a las ocho menos cuarto. Durante meses, alguien lo lanzó a mano.
Un lunes esa persona estaba enferma y el informe no llegó.
Una máquina debe hacer sola lo que se repite. Y debe mantener en marcha, sin ayuda, los programas importantes.
Al final de esta lección
Nota
Puedo ejecutar un programa como servicio y programar una tarea.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Servicio | un programa que el sistema mantiene en marcha | |
| systemd | el programa que arranca y vigila los servicios | systemctl |
| Archivo de unidad | un archivo pequeño que describe un servicio a systemd | |
| Habilitar | hacer que un servicio arranque con la máquina | |
| Cron | el programa que lanza tareas a horas fijas | |
| Tarea de cron | una línea con una hora y una orden | 45 7 * * 1 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
systemd mantiene los servicios
Un servicio es un programa que debe estar siempre en marcha, como un servidor web o un programa de correo. En Ubuntu, systemd los arranca con la máquina y los vigila.
Hablas con systemd mediante systemctl. Puedes preguntar si un servicio está activo (is-active) y si arranca con la máquina (is-enabled).
¿Está activo el servicio cron?
systemctl is-active cronSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
¿Arranca con la máquina?
systemctl is-enabled cronSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
La historia completa
systemctl status cron --no-pagerSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
El archivo de unidad de cron
systemctl cat cron --no-pagerSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo: los verbos de systemctl
| Orden | Qué hace | ¿Sobrevive a un reinicio? |
|---|---|---|
| systemctl start reservas | Lo arranca ahora | No |
| systemctl stop reservas | Lo para ahora | No |
| systemctl restart reservas | Lo para y lo arranca | No |
| systemctl enable reservas | Hace que arranque con la máquina | Sí |
| systemctl disable reservas | Hace que no arranque con la máquina | Sí |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un archivo de unidad tiene tres partes
Un archivo de unidad es texto sencillo. El que escribes tú va en /etc/systemd/system. El que trae un paquete está en /usr/lib/systemd/system. [Unit] describe el servicio. [Service] dice qué ejecutar en ExecStart y si debe volver tras un fallo en Restart. [Install] dice cuándo arrancar. El bloque siguiente muestra uno para un programa llamado reservas.
Una unidad para otro programa
[Unit]
Description=Programa de reservas del restaurante
[Service]
ExecStart=/usr/local/bin/reservas
Restart=on-failure
[Install]
WantedBy=multi-user.target
Un error frecuente
Advertencia
Mucha gente cree que systemctl start también hace que el servicio vuelva tras un reinicio. No es así. start lo arranca ahora. enable hace que arranque con la máquina. Si necesitas las dos cosas, haz las dos.
Cron lanza una orden a horas fijas
Una línea de cron tiene cinco campos de tiempo y después la orden. Los campos son minuto, hora, día del mes, mes y día de la semana.
Un asterisco * significa todos. Un número significa exactamente ese. En el campo de minutos, */10 significa cada diez minutos: 0, 10, 20 y así.
Ejemplo: leer horas de cron
| Campos | Se ejecuta |
|---|---|
| 45 7 * * 1 | A las 07:45 cada lunes |
| 0 * * * * | Al principio de cada hora |
| */10 * * * * | Cada diez minutos |
| 0 9 1 * * | A las 09:00 el día 1 de cada mes |
| 30 23 * * 5 | A las 23:30 cada viernes |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Tu propia lista de tareas
crontab -lSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Dos líneas de ejemplo para cron
# minuto hora dia-del-mes mes dia-de-la-semana usuario orden
45 7 * * 1 root /usr/local/bin/informe-semanal.sh
*/20 * * * * root /usr/local/bin/sincronizar-stock.sh
La carpeta del sistema añade un campo
La lista de un usuario, que muestra crontab -l, tiene las cinco horas y la orden.
Un archivo de /etc/cron.d añade el usuario con el que se ejecuta, entre la hora y la orden. Si cron no acepta un archivo, lo salta sin avisar en pantalla. El dueño debe ser root y nadie más puede escribir en él. El nombre no lleva punto, así que informe.cron se salta. La última línea debe acabar en salto de línea.
La carpeta de tareas del sistema
ls -l /etc/cron.dSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un script que espera su hora
cat /usr/local/bin/backup.shSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
systemd también tiene temporizadores
systemctl list-timers --no-pagerSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Para ir más lejos
Cron lee 1-5 en el campo del día de la semana como de lunes a viernes. En papel, escribe la línea de un archivo de /etc/cron.d que ejecute /usr/local/bin/sincronizar-stock.sh como root a las 22:45, solo entre semana.
Después di cuándo se ejecuta la próxima vez si ahora es viernes a las 23:00.