Crear un Cron Job personalizado

Generalidades

Este artículo muestra cómo crear manualmente un cron job usando tu usuario Shell. Esto envuelve iniciar sesión dentro del servidor vía SSH para correr varios comandos.

Estas instrucciones pueden ser usadas también para editar un cron job existente creado en el panel, sin embargo por simplicidad, es recomendado que si lo has creado en el panel, seguirlo editando desde el panel. Esto es importante ya que agregar un cron job en el panel sobrescribirá tu archivo crontab personalizado como se menciona a continuación.

Sitios web de DreamPress

Las instrucciones en este artículo no aplican a los sitios web DreamPress. Si necesitas crear un cron job para un sitio web de DreamPress, debe crearse en el panel. Revisa el siguiente artículo par amás información:

Detalles básicos

En los siguientes ejemplos, username sería tu usuario Shell y example.com tu sitio web.

Los archivos crontab están donde las listas de jobs y otras instrucciones del cron daemon están guardadas. Cada usuario en DreamHost tiene su propio archivo crontab que puede ser accesado corriendo el siguiente comando en tu usuario Shell:

[server]$ crontab -e

Los archivos crontab son simples archivos de texto que tienen un formato en particular. Cada línea del archivo crontab sigue un formato en particular como series de campos, separados por espacios y/o pestañas. Cada campo puede tener un valor singular o series de valores. Un cronjob debe tener exactamente una línea, pero ésta puede ser una línea larga (más de 80 caracteres).

Algunas cosas para ver cuando estás creando/editando un crontab

Cada línea tiene cinco campos de tiempo/fecha, seguido por un comando, seguido por una nueva línea de caracter ('\n'). Un problema común es no incluir una nueva línea, entonces presiona “Enter/Devolverse” una o tres veces al final de tu comando.

Otro problema común es romper automáticamente un ajuste de línea de una línea larga a múltiples líneas, asegúrate de que tu editor no haga esto.

Las líneas vacías, los espacios principales y pestañas son ignorados. La líneas que su primer caracter es el signo numeral (#) son ignorados pues son considerados comentarios. Nota que los comentarios no son permitidos en la misma línea que los comandos de cron, pues son interpretados como parte del comando. Similarmente, los comentarios no son permitidos en la misma línea como configuraciones variables del ambiente (cómo MAILTO).

¿Que pasa si ya he creado un cron job en el panel dentro del usuario Shell?

Hay dos manera de crear cron jobs personalizados.

  • Editar el crontab existente en el servidor.
  • Usar un archivo personalizado crontab.

Si ya has editado el crontab existente

Si ya has creado un cron job en tu panel, puedes verlo corriendo crontab -e en tu usuario Shell. Si tu editas el archivo para agregar otro cron job debajo del existente del panel, el cron job del panel continuará funcionando normalmente en adición al nuevo código editado.

Cualquier ajuste en el panel no afectará tu código personalizado.

Si tu cambias el servidor crontab con tu crontab personalizado

Puedes también usar un crontab personalizado que has creado. Si haces esto, el crontab del servidor se sobreescribirá. Puedes también reemplazar el crontab del servidor corriendo lo siguiente:

[server]$ crontab /home/username/crontab

Sin embargo, si tu agregas o editas un cron job en el panel, tu crontab personalizado será sobre escrito. Entonces necesitarás usar el crontab del servidor, o usar tu crontab personalizado.

Crear manualmente un cron job personalizado

La siguiente sección está también disponible como video instructivo:

Las siguientes instrucciones explican cómo agregar un cron job en tu usuario Shell. Estas instrucciones asumen que NO has agregado un cron job en tu panel todavía, entonces el archivo crontab está vacío.

  1. Inicia sesion en tu servidor vía SSH usando el usuario Shell en el que deseas crear el cron job.
  2. Una vez dentro, corre el siguiente comando para abrir el archivo crontab.
    [server]$ crontab -e
    It looks like you don't have a MAILTO line in your crontab file
    For performance reasons we ask that you specify an address where
    cronjob output will be delivered.  If you do not wish to receive
    cronjob output, simply press enter and cronjob output will not be
    mailed to you.
    
    For more information regarding this, please visit:
    https://help.dreamhost.com/hc/en-us/articles/215088608
    
    Where would you like cronjob output delivered? (leave blank to disable)
    : admin@example.com
    
    cronjob output will be emailed to admin@example.com
    confirm? (y/N): y

    Después de agregar tu correo (o dejarlo en blanco), debes elegir qué editor de texto te gustaría usar.

    Select an editor.  To change later, run 'select-editor'.
      1. /usr/bin/joe
      2. /usr/bin/jstar
      3. /usr/bin/jpico
      4. /usr/bin/jmacs
      5. /usr/bin/jed
      6. /bin/nano        <---- easiest
      7. /usr/bin/vim.basic
      8. /usr/bin/rjoe
      9. /usr/bin/mcedit
      10. /usr/bin/vim.tiny
      11. /bin/elvis-tiny
      12. /usr/bin/emacs25
      13. /bin/ed
    
    Choose 1-13 [3]: 6
    
    Deberás escoger un editor para ver este archivo #6 usa un programa nano el cual es el más fácil. Mira el artículo 'Crear y editar un archivo vía SSH' para ver instrucciones de como usar nano.

    Las opciones anteriores se muestran si estás conectado a un servidor compartido. Si has iniciado sesión en un VPS que ejecuta Debian, verás la siguiente lista:

    Select an editor.  To change later, run 'select-editor'.
      1. /bin/ed
      2. /bin/nano        <---- easiest
      3. /usr/bin/emacs24
      4. /usr/bin/vim.basic
      5. /usr/bin/vim.tiny
  3. Se abre un archivo crontab en blanco. Agrega el código para tu cron job. En la parte inferior, agrega el código para tu cron job. Este ejemplo corre un archivo llamado mail.php dentro del usuario "username". Esto debe ser llamado de la misma manera que el usuario con el que estás logueado. Este ejemplo corre el cron job a las 8:13 pm.
    # Custom cron job
    MAILTO="user@example.com"
    13 20 * * * php  /home/username/mail.php

    Hay dos partes del comando. La primera debe especificar el camino al programa que deseas usar para correr el cron job. Por ejemplo digamos que tu tienes un archivo PHP llamado script.php en tu directorio de dominios:

    • /home/username/example.com/script.php

    Para correr este comando ingresaras el camino que has escogido de la versión de PHP seguido por un espacio, seguido luego por el camino al archivo:

    • /usr/local/php82/bin/php /home/username/example.com/script.php

    Usarás también la versión por defecto usando “php” en vez del camino completo.

  4. Guarda el archivo. Verás la siguiente respuesta:
    crontab: installing new crontab

Y eso es todo, El cron job correrá cada día a las 8:13 pm.

Comandos de Crontab

Date cuenta que si tu escoges reemplazar el servidor de crontab, todos tus cron job creados en el panel para un usuario no seguirá funcionando pues han sido sobreescritos en el servidor.

Adicionalmente, si tu actualizas tus cron jobs dentro de este usuario en el panel, va a sobreescribir tu crontab personalizado. El crontab se reemplazará en su forma original creada en el panel.

Reemplazar tu crontab existente con tu archivo crontab personalizado

[server]$ crontab /home/username/crontab

Editar tu servidor crontab

[server]$ crontab -e

Ver tu crontab

[server]$ crontab -l

Eliminar tu crontab

[server]$ crontab -r

Explicación de los campos de hora/fecha

Los primeros cinco campos de la línea son los campos de fecha y hora lo cual especifican cómo y cuándo correr un comando. Cuando agregues un cron job al panel de DreamHost la Hora/Fecha es agregada automáticamente por tí basado en tu configuración 'When to run' o 'Cuando correr'.

Field no. Description Permitted values
1 minuto 0-59
2 hora 0-23
3 día del mes 1-31
4 mes 1-12
5 día de la semana 0-7

Nota: Para el día de la semana, ambos 0 y 7 son considerados domingo.

El tiempo es basado en eso del servidor que corre el cron.

Otra manera (gráfica) es viendo estos campos.

 * * * * *  comando para ejecutar
 │ │ │ │ │
 │ │ │ │ │
 │ │ │ │ └───── día de la semana (0 - 6) (0 a 6 son de domingo a sábado, o usar nombres; 7 es domingo, igual que 0)
 │ │ │ └────────── mes (1 - 12)
 │ │ └─────────────── día de la semana (1 - 31)
 │ └──────────────────── hora (0 - 23)
 └───────────────────────── min (0 - 59)

Hay varias maneras de especificar múltiples valores en esos campos.

  • El operador de coma (',') coma especifica una lista de valores.
    • 1,3,4,7,8
  • El operador guión ('-') especifica un rango de valores.
    • 1-6
    • Esto es equivalente a "1,2,3,4,5,6".
  • El operador asterisco ('*') (frecuentemente conocido como wildcard) especifica todos los posibles valores para un campo. Por ejemplo, un asterisco en el campo de la hora (segundo) será equivalente a 'cada hora'.

    Si configuras el cron job para que se ejecute en un día específico de la semana, los campos mes (month) y día del mes seguirán (day of month) apareciendo como un asterisco (*). El valor del día de la semana anulará estos valores, por lo que solo se ejecutará una vez por semana en el día seleccionado.

  • El operador barra inclinada ('/') puede ser usado en conjunción con un asterisco para saltar unos valores de números dados. Ejemplo:
    • /3
    • Esto significa saltar cada tercer valor. Entonces "*/3" en el campo de la hora es equivalente a "0,3,6,9,12,15,18,21"; "*" específica 'cada hora' pero el "/3" Significa solo el valor primero, cuarto y séptimo dado por "*" usados.

Puedes también usar una de las cuerdas especiales para poner el los campos de tiempo/hora.

Entrada Descripción Equivalent e a Ejemplo
@yearly (or @annually) Ejecutar una vez al año a medianoche el 1ro de Enero 0 0 1 1 * @yearly php /home/username/mail.php
@monthly Ejecutar una vez al mes a medianoche el primer día del mes 0 0 1 * * @monthly php /home/username/mail.php
@weekly Ejecutar una vez a la semana a medianoche el Domingo 0 0 * * 0 @weekly php /home/username/mail.php
@daily (or @midnight) Ejecutar una vez al día a medianoche 0 0 * * * @daily php /home/username/mail.php
@hourly Ejecutar una vez por hora al inicio de la hora 0 * * * * @hourly php /home/username/mail.php
@reboot Ejecutar al inicio del daemon cron @reboot @reboot php /home/username/mail.php

Revisa el siguiente artículo de Wikipedia para más información:

Salida

La salida del cron job es determinado por lo que es enviado al terminal como resultado de los comandos/scripts que son ejecutados. Por defecto, todas las salidas son enviadas por correo a la variable MAILTO (ver la artículo del requerimiento de la variable MAILTO para más información). Como se ve arriba, si un comando de cron job no crea ninguna salida en el comando entonces ningún correo es enviado.

Tú puedes proveer de instrucciones especiales para la salida estándar o "standard out" (STDOUT), un error estándar o un "standard error" (STDERR) usando el operador >. Cuando tu usas > sin un número antes de él, se pondrá automáticamente como 1>. Esta es la salida estándar de no error (non-error).

Cuando usas 2> estás especificando qué hacer con la salida del error. Por ejemplo, >mi_archivo.txt redirecciona la salida estándar a un archivo llamado mi_archivo.txt, y 2>mis_errores.txt redirecciona los errores a un archivo llamado mis_errores.txt.

Permisos

Por defecto, los archivos creados en los servidores de DreamHost tienen permisos nivel 644. Si tu escoges correr un script vía cron, puedes necesitar poner los permisos del archivo a 744 usando chmod para permitir que se ejecute correctamente.

Ejemplos de scripts de cron personalizados

Los siguientes ejemplos muestran lo que tú puedes agregar a un nuevo archivo para crear un cron job.

Ejemplo 1: Esto corre el comando a las 4:10 PM PST/PDT, y envía un correo con la salida del error regular al destinatario especificado por MAILTO.

10 16 * * * perl /home/username/bin/script.pl

Ejemplo 2: Esto corre el comando a las 2:00 AM PST/PDT el sábado, y la única salida son errores.

0 2 * * 6 sh /home/username/semanal/semanal.sh > /dev/null

Ejemplo 3: Esto corre a la medianoche del nuevo año (Enero 1) y no hay salida.

0 0 1 1 0 python /home/username/script.py >/dev/null 2>&1

2>&1 es una redirección especial que envía el error estándar ("2>") al mismo lugar que la salida estándar (">" o "1>").

Ejemplo 4: Esto corre un script de PHP llamado cron.php empezando cada hora.

0 * * * * php /home/username/cron.php

Ejemplo 5: Esto corre el script local (localizado en DreamHost) cada 15 minutos.

*/15 * * * * /usr/local/php82/bin/php /home/username/script.php

Ejemplo 6: Esto corre un script especial (alojado en otro lugar) cada 30 minutos usando curl.

*/30 * * * * /usr/bin/curl -s https://example.com/send.php &> /dev/null

&>/dev/null es una abreviación para 1> /dev/null 2> &1. Redirecciona ambos descriptor de archivos 2 (STDERR) y descriptor 1 (STDOUT) a /dev/null.

Revisa unix.stackexchange.com/a/70971 para más información.

Ejemplo 7: Esto corre el script local (alojado en DreamHost) cada 10 minutos.

*/10 * * * * /usr/local/php82/bin/php /home/username/script.php

Ejemplo 8: Esto usa wget para descargar un archivo al directorio llamado /cronfolder.

*/10 * * * */usr/bin/wget -P /home/username/cronfolder/ https://example.com/index.html

Editar un Servidor Dedicado

Si estás logueado como usuario administrador de Servidor Dedicado, tu puedes editar el archivo crontab directamente. Está almacenado aquí.

/var/spool/cron/crontabs/username

Necesitarás usar sudo en tu Servidor Dedicado (o iniciar una sesión interactiva como el usuario root con sudo -i) para acceder al archivo.

Si requieres acceso sudo/admin, debes mejorar a un Servidor Dedicado.

Ejemplo (abriendo el archivo con el editor de texto "vi"):

[server]$ sudo vi /var/spool/cron/crontabs/username

Ver también

¿Este artículo ha respondido sus preguntas?

Última actualización el PST.

¿Aún no encuentra lo que busca?