Los dos ejecutan algo según un horario. La diferencia aparece cuando una tarea falla, cuando se alarga o cuando la máquina estaba apagada justo a la hora prevista.

Cron y sus dos trampas

crontab -e
# m h dom mon dow  command
15 3 * * *  /usr/bin/php /var/www/site/cron.php >> /var/log/site-cron.log 2>&1
  • El entorno está casi vacío. PATH es mínimo y tu perfil de shell no se lee, así que una orden que funciona cuando la escribes falla aquí. Usa rutas absolutas.
  • La salida es correo, no un registro. Sin la redirección de arriba va a un buzón local que nadie lee, y la tarea parece haberse ejecutado en silencio.

Si una tarea de cron parece no ejecutarse nunca, la lista de Tareas de cron que nunca se ejecutan cubre el resto.

Un timer y lo que añade

# /etc/systemd/system/site-cron.service
[Unit]
Description=Site maintenance

[Service]
Type=oneshot
User=www-data
WorkingDirectory=/var/www/site
ExecStart=/usr/bin/php cron.php
# /etc/systemd/system/site-cron.timer
[Unit]
Description=Run site maintenance nightly

[Timer]
OnCalendar=*-*-* 03:15:00
Persistent=true
RandomizedDelaySec=300

[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now site-cron.timer
systemctl list-timers --all
journalctl -u site-cron -n 50

Lo que te da el timer

  • Registros en el journal, con el código de salida, en cada ejecución.
  • Sin solapamiento: una ejecución que sigue en marcha cuando toca la siguiente no arranca una segunda copia.
  • Persistent=true: una ejecución perdida con la máquina apagada ocurre en el siguiente arranque.
  • RandomizedDelaySec: una flota de servidores no golpea toda la misma API a las 03:15:00 en punto.

Cuál usar

Una tarea de una línea en una máquina: cron, y no le des más vueltas. Todo aquello cuyo historial necesites ver, todo lo que no debe ejecutarse dos veces y todo lo que importa si se pierde: un timer.

No programes la misma tarea en los dos. Es un resultado habitual de una migración a medias, y duplica cada ejecución, incluidas las que mandan correo o cobran tarjetas.