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.

Detalles básicos

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).

Cosas a 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/mycrontab

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

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
      no crontab for example_username - using an empty one
      
      Select an editor.  To change later, run 'select-editor'.
        1. /bin/ed
        2. /bin/elvis-tiny
        3. /bin/nano        <---- easiest
        4. /usr/bin/emacs24
        5. /usr/bin/jed
        6. /usr/bin/jmacs
        7. /usr/bin/joe
        8. /usr/bin/jpico
        9. /usr/bin/jstar
        10. /usr/bin/mcedit
        11. /usr/bin/rjoe
        12. /usr/bin/vim.basic
        13. /usr/bin/vim.tiny
      
      Choose 1-13 [3]: 3
      
    3. Deberás escoger un editor para ver este archivo #3 usa un programa “nano” el cual es el más fácil. Vé el artículo 'Crear y editar un archivo cía SSH' para ver instrucciones de como usar nano.
    4. Se te presentará este nuevo archivo crontab:
      # Edit this file to introduce tasks to be run by cron.
      #
      # Each task to run has to be defined through a single line
      # indicating with different fields when the task will be run
      # and what command to run for the task
      #
      # To define the time you can provide concrete values for
      # minute (m), hour (h), day of month (dom), month (mon),
      # and day of week (dow) or use '*' in these fields (for 'any').#
      # Notice that tasks will be started based on the cron's system
      # daemon's notion of time and timezones.
      #
      # Output of the crontab jobs (including errors) is sent through
      # email to the user the crontab file belongs to (unless redirected).
      #
      # For example, you can run a backup of all your user accounts
      # at 5 a.m every week with:
      # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
      #
      # For more information see the manual pages of crontab(5) and cron(8)
      #
      # m h  dom mon dow   command
    5. En la parte inferior, agrega el código para tu cron job. Este ejemplo corre un archivo llamado mail.php dentro del usuario "ejemplo_usuario". 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/example_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/php71/bin/php /home/username/example.com/script.php

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

    6. 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/filename

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 ejecutar 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 minute 0-59
2 hour 0-23
3 day of the month 1-31
4 month 1-12
5 day of the week 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.

 # * * * * *  command to execute
 # │ │ │ │ │
 # │ │ │ │ │
 # │ │ │ │ └───── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
 # │ │ │ └────────── month (1 - 12)
 # │ │ └─────────────── day of month (1 - 31)
 # │ └──────────────────── hour (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'.
  • 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) Run once a year at midnight on January 1 0 0 1 1 * @yearly php /home/example_username/mail.php
@monthly Run once a month at midnight on the first day of the month 0 0 1 * * @monthly php /home/example_username/mail.php
@weekly Run once a week at midnight on Sunday morning 0 0 * * 0 @weekly php /home/example_username/mail.php
@daily (or @midnight) Run once a day at midnight 0 0 * * * @daily php /home/example_username/mail.php
@hourly Run once an hour at the beginning of the hour 0 * * * * @hourly php /home/example_username/mail.php
@reboot Run at startup (of the cron daemon) @reboot @reboot php /home/example_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 sección 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 ejecutar 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/yourscript.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/weekly/weekly-pruning.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/happy.new.years.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 (">" or "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/php71/bin/php /home/example_username/myscript.php

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

*/30 * * * * /usr/bin/curl -s http://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.

Ve http://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/php71/bin/php /home/example_username/myscript.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/youruser

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/youruser

Ver también

¿Este artículo ha respondido sus preguntas?

Última actualización el PST.