Cron en DirectAdmin: cómo programar tareas en tu hosting
En pocas palabras
En DirectAdmin, las tareas programadas se crean en Funciones avanzadas, Cron Jobs: completás cinco campos de horario (minuto, hora, día, mes y día de la semana) y el comando. Por ejemplo, 0 4 * * * corre todos los días a las 4:00 y */10 * * * * cada diez minutos. Para un script PHP, ejecutá el archivo con /usr/local/bin/php y su ruta completa en lugar de llamar a la URL, y terminá el comando con >> archivo.log 2>&1 para que la salida no te llene de correos. La hora que cuenta es la del servidor, que puede no ser la de Argentina.
Un ejemplo completo antes de la teoría
Cron es el programa del sistema operativo que ejecuta comandos en horarios fijos, entre alguien al sitio o no. Sirve para lo que tiene que pasar solo: vaciar temporales, mandar recordatorios, traer el listado de precios de un proveedor, volcar la base a un archivo.
Supongamos que tu sitio tiene un script que borra los presupuestos vencidos y querés que corra todas las madrugadas a las 4. En el formulario del panel cada campo va en su casillero; escrito en una línea, como lo guarda el sistema, queda así:
0 4 * * * /usr/local/bin/php /home/usuario/domains/tudominio.com.ar/public_html/scripts/limpiar.php >> /home/usuario/limpiar.log 2>&10 4 * * *es el horario: minuto 0, hora 4, y cualquier día, mes y día de la semana./usr/local/bin/phpes el intérprete de PHP del servidor, con su ruta completa.- La ruta del script empieza en
/home/usuario, dondeusuarioes el de tu cuenta de hosting. Copiala del administrador de archivos para no equivocarte. >> /home/usuario/limpiar.log 2>&1guarda lo que el script imprime, errores incluidos, en un archivo en lugar de mandarlo por correo.
Dónde se crea en el panel
- Entrá a DirectAdmin con el usuario y la clave de tu cuenta de hosting, los del correo de bienvenida.
- Buscá "Funciones avanzadas" (Advanced Features) y abrí "Cron Jobs". Si no la ves, escribí "cron" en el buscador del panel.
- Tocá el botón para crear una tarea nueva, completá los cinco campos de horario y el comando.
- Guardá. La tarea aparece en la lista y corre en el próximo horario que coincida; no hay que reiniciar nada.
Cómo se lee el horario
Los cinco campos van en este orden: minuto (0 a 59), hora (0 a 23, reloj de 24 horas), día del mes (1 a 31), mes (1 a 12) y día de la semana (0 a 7, donde el domingo es 0 y también 7). Cada uno acepta un número, un asterisco o una combinación:
| Símbolo | Significa | Ejemplo en el campo de la hora |
|---|---|---|
* | Cualquier valor | *: todas las horas |
| Un número | Ese valor exacto | 14: a las 14 |
, | Una lista | 8,13,19: a las 8, a las 13 y a las 19 |
- | Un rango | 9-18: de 9 a 18, ambas incluidas |
/ | Un paso | */6: a las 0, 6, 12 y 18 |
Horarios frecuentes, listos para copiar
| Horario | Cuándo corre |
|---|---|
*/10 * * * * | Cada diez minutos |
15 * * * * | A los quince minutos de cada hora |
0 4 * * * | Todos los días a las 4:00 |
0 7 * * 1-5 | De lunes a viernes a las 7:00 |
0 23 * * 0 | Los domingos a las 23:00 |
0 6 1,15 * * | Los días 1 y 15 de cada mes a las 6:00 |
30 5 1 1,4,7,10 * | El primer día de cada trimestre a las 5:30 |
Si ponés un valor en el día del mes y otro en el día de la semana, cron corre cuando se cumple cualquiera de los dos, no ambos. Para una sola condición, dejá el otro campo en asterisco.
La hora del servidor puede no ser la tuya
Cron usa el reloj del servidor. Argentina está en UTC−3 todo el año, sin horario de verano, y muchos servidores trabajan en UTC: si es el caso, una tarea con hora 4 corre a la 1 de la madrugada de Buenos Aires. Para una limpieza da lo mismo; para un aviso que tiene que salir a las 9 en punto, no.
El hosting no tiene acceso por SSH, así que la hora del servidor se averigua con una tarea de prueba: creá una cada cinco minutos con el comando date >> /home/usuario/reloj.txt, compará lo que anota con tu reloj y borrala.
PHP por consola o una URL: cuál elegir
Ejecutar el script con el intérprete de consola no pasa por el servidor web: no tiene el límite de tiempo de una visita y nadie de afuera lo puede activar. Llamar la URL con curl es como abrir la página en el navegador: el script ve el dominio y las cabeceras, pero corre con los límites del servidor web y cualquiera que conozca la dirección lo puede disparar.
Por consola es la opción correcta casi siempre. La URL tiene sentido cuando el script depende del dominio para funcionar, o cuando el propio sistema te da una dirección de cron con una clave, como hacen PrestaShop y otras aplicaciones.
# por consola (recomendado)
/usr/local/bin/php /home/usuario/domains/tudominio.com.ar/public_html/tarea.php >> /home/usuario/tarea.log 2>&1
# por URL, solo si el script lo necesita
curl -fsS "https://tudominio.com.ar/tarea.php?clave=una-clave-larga" >> /home/usuario/tarea.log 2>&1- Si tu sitio usa una versión de PHP distinta de la principal, el intérprete de esa versión suele estar en una ruta como
/usr/local/php82/bin/php, con el número de la versión. Si dudás, preguntale al soporte cuál corresponde a tu cuenta. - Cuando la tarea arranca, la carpeta actual no es la del sitio. Si el script incluye archivos con rutas relativas, agregá al principio
chdir(__DIR__);. - El signo
%tiene un significado especial en cron, que corta el comando ahí. Si lo necesitás, por ejemplo endate +%F, escribilo como\%.
Que no te llegue un correo por cada corrida
Cron manda por correo todo lo que el comando imprime. Una tarea cada diez minutos que escribe una sola línea genera 144 mensajes por día. Según cómo esté configurada la página de Cron Jobs, van a la dirección que figure ahí o al buzón de sistema de la cuenta, que no es ninguna de tus casillas: nadie los lee y ocupan el disco del plan hasta que alguien se da cuenta.
>> /home/usuario/tarea.log 2>&1guarda todo en un archivo. Es lo mejor: si algo falla, tenés el registro.> /dev/null 2>&1lo descarta. Sirve para tareas que ya sabés que andan.- El
2>&1es lo que suma los errores. Sin eso solo redirigís la salida normal, y los errores siguen llegando por correo. - El archivo de registro también crece. Si la tarea es frecuente, sumá otra que lo vacíe una vez por mes con
: > /home/usuario/tarea.log.
El cron de WordPress, hecho bien
WordPress no tiene reloj propio: revisa si hay tareas pendientes cada vez que alguien carga una página. En un sitio con pocas visitas, una entrada programada para las 8 puede publicarse a las 11; en uno con muchas, a alguna visita le toca cargar con el trabajo atrasado. La solución es apagar ese mecanismo y que lo dispare el servidor:
- En
wp-config.php, antes del comentario que marca el final de la edición, agregádefine( 'DISABLE_WP_CRON', true );. - Creá una tarea con horario
*/10 * * * *y el comando/usr/local/bin/php /home/usuario/domains/tudominio.com.ar/public_html/wp-cron.php >> /home/usuario/wp-cron.log 2>&1. - Al día siguiente, revisá que el registro no tenga errores y programá una entrada de prueba para dentro de media hora.
Cuando la tarea no hace nada
- Mirá primero el archivo de registro. Si está vacío, agregá al principio del script una línea que imprima la fecha: así sabés si llegó a arrancar.
- Revisá que el comando use rutas completas, tanto la del intérprete como la del script. La tarea corre con un entorno mínimo y no conoce los atajos de tu sesión.
- Como el hosting no tiene SSH, probá el comando con una tarea que corra cada cinco minutos y mande todo a un archivo, agregando
>> /home/usuario/prueba.txt 2>&1al final. Leé el archivo desde el administrador de archivos y borrá la tarea cuando funcione. - Si el script anda en el navegador y no en cron, casi siempre es una ruta relativa o algo como
$_SERVER['HTTP_HOST'], que por consola no existe. - Si la tarea tarda más que el intervalo, las corridas se enciman. Espaciala o poné
/usr/bin/flock -n /home/usuario/tarea.lockdelante del comando: una corrida nueva se retira si la anterior sigue.
Preguntas frecuentes
¿Puedo programar una tarea para que corra una sola vez?
Cron no tiene "una sola vez": repite según el horario. Podés poner una fecha concreta, como 0 9 20 12 * para el 20 de diciembre a las 9, y borrar la tarea después, porque si no, se repite al año siguiente.
¿Por qué volvió a aparecer una tarea que borré?
Porque la creó un plugin o un instalador, que la vuelve a agregar si no la encuentra. Desactivá la opción en el plugin, o el plugin mismo, antes de borrarla del panel.
¿Qué hago si necesito algo casi en tiempo real?
Cron no baja del minuto, y en un hosting compartido no corresponde dejar procesos corriendo todo el tiempo. Si tu aplicación necesita una cola que procese trabajos al instante o un servicio que quede escuchando, es trabajo para un VPS con systemd, como contamos en tareas con cron y systemd.
¿La tarea usa recursos de mi plan?
Sí. Mientras corre ocupa procesador, memoria y un proceso de tu cuenta, igual que una visita. Por eso conviene dejar las tareas pesadas para la madrugada y no encimarlas con los horarios de más tráfico.
Seguí leyendo
Programar tareas en Linux con cron y con timers de systemd
Cómo se escribe una línea de crontab, horarios útiles, por qué una tarea anda a mano y falla en cron, y cuándo conviene un timer de systemd.
8 min de lectura
Backup y restauración en DirectAdmin: armar, bajar y recuperar
Qué tildar al armar un respaldo en DirectAdmin, dónde queda el archivo, cómo bajarlo y revisarlo, y cómo restaurar todo o una parte sin pisar lo que no querés.
7 min de lectura
Endurecer WordPress: los ajustes que protegen sin sumar plugins
Actualizaciones, cuentas, wp-config.php, carpeta de subidas y acceso al escritorio: lo que de verdad frena los ataques a WordPress y lo que es maquillaje.
6 min de lectura
