los cron
La utilidad se utiliza para ejecutar scripts y comandos a intervalos regulares y en fechas y horas específicas. Está integrado en la mayoría de las distribuciones de Linux y proporciona una forma muy útil de programar tareas en su servidor.
cron
es una herramienta de automatización, por lo que cualquier cosa que ejecute de forma regular probablemente se pueda cambiar a un trabajo cron. Si desea realizar copias de seguridad diarias periódicas o reiniciar un servicio una vez a la semana, cron
puedo hacer eso.
¿Cómo funciona Cron?
Los trabajos cron se definen en un archivo llamado crontab. Este archivo es único para cada usuario y, aunque normalmente se encuentran en /var/spool/cron/crontabs
, no están pensados para editarse directamente. En su lugar, los edita a través del crontab
mando:
crontab -e
Esto abrirá el crontab de su usuario en su editor de texto CLI predeterminado. Si esto lo tiene atascado en vim, puede cambiar el editor predeterminado ejecutando select-editor
en algunos sistemas, o agregando export VISUAL=micro;
para usted ~/.bashrc
(o equivalente de shell).
De forma predeterminada, es probable que su crontab esté en blanco, por lo que tendrá que agregar trabajos manualmente. Un trabajo cron generalmente se formatea como:
minute hour day month weekday <command-to-execute>
El comando a ejecutar puede ser cualquier cosa, incluidos los scripts de shell.
Los valores de cada variable de tiempo pueden ser comodines, que cron interpretará como siempre verdaderos. Por ejemplo, si quisiera ejecutar un trabajo quince minutos después de cada hora, todos los días, usaría:
15 * * * * command
Esto se ejecutará en el minuto 15 de cada hora, cada día, cada mes, sin importar el día de la semana.
Si quisiera ejecutar un trabajo a las 5:30 p. M. Todos los viernes, usaría:
30 17 * * 5 command
cron
también admite valores escalonados y escalonados. Los valores de rango incluyen todos los valores dentro de un rango específico. Si quisiera ejecutar un trabajo cada hora mientras trabaja, usaría:
0 9-17 * * 1-5 command
De 9 a. M. A 5 p. M., De lunes a viernes. Del mismo modo, puede definir una lista de valores separándolos con comas.
Los valores escalonados se ejecutan a intervalos más específicos. Puede ejecutar trabajos cada dos horas utilizando:
0 */2 * * * command
Tenga en cuenta que el reloj comienza a la medianoche, 00:00. Su trabajo se ejecutará una vez, luego a las 2 a. M., Luego a las 4 a. M. Y así sucesivamente.
Algunas versiones de cron
admite más sintaxis, como @daily
correr una vez al día, o @reboot
para ejecutarse en cada reinicio, aunque su distribución puede variar.
Si desea una forma sencilla de depurar cron
sintaxis, hay muchos editores en línea como crontab.guru que le mostrará lo que significa la expresión de su horario en términos simples, es decir, «A minuto 0 cada segunda hora. «
RELACIONADO: Cómo utilizar Cron con sus contenedores Docker
Asegurándose de que Cron esté funcionando
Cron no le muestra ningún indicio de que esté ejecutando sus trabajos. Si desea saber si está funcionando, deberá redirigir la salida manualmente. Puede hacer esto canalizando la salida a un archivo de registro:
* * * * * echo "test" >> logfile 2>&1
los >>
el operador agrega la salida a un archivo, y el 2>&1
El operador se asegura de incluir stderr en la salida. El equivalente de bash sería &>>
en lugar del >>
, pero eso puede no funcionar en todas las distribuciones, ya que cron usa /bin/sh
por defecto.
Cron se puede configurar para enviar correos electrónicos con la salida de trabajos. En realidad, lo hace de forma predeterminada con la dirección de correo electrónico predeterminada de su cuenta de usuario, pero es probable que no esté configurada correctamente. Para que el correo electrónico funcione, necesitará un agente de correo configurado y configurado en su servidor, lo que le permitirá utilizar el mail
comando para enviar correos electrónicos. Luego, coloque esta línea encima de sus trabajos cron en su trabajo cron:
MAILTO="[email protected]"
Ahora, cualquier salida de cualquier trabajo que vaya a stdout (por ejemplo, no está canalizada en alguna parte) se enviará a través de mail
a la dirección que especificó. Puede probar esto agregando un trabajo temporal para hacer eco en stdout cada minuto:
* * * * * echo "cron mail is working!"
Solo asegúrese de apagar ese trabajo una vez que esté funcionando, o se volverá molesto muy rápidamente.
Cron usa / bin / sh por defecto, no Bash
Es posible que esté usando un caparazón diferente al cron
ejecuta sus trabajos en. Bash (/bin/bash
) es un shell común en la mayoría de las distribuciones y es una implementación de sh. los /bin/sh
el archivo es un enlace simbólico a un sh
implementación, pero no siempre es bash. En sistemas basados en Debian como Ubuntu y en macOS, /bin/sh
enlaces a dash
por defecto.
El resultado final de esta confusión es que es posible que sus scripts no se ejecuten igual y que su variable PATH (entre otras) no esté configurada correctamente. Puede evitar esto de varias maneras, y la variante de su distribución de cron
puede funcionar de manera diferente, por lo que es posible que deba probar un par:
- Añadiendo
SHELL=/bin/bash
en la parte superior de su crontab. Es posible que también tenga que agregarBASH_ENV="/root/.bashrc"
para que lea su perfil de bash. - Poniendo
/bin/bash
antes del comando en cada trabajo. Es posible que deba configurar elBASH_ENV
variable incluso si no está cambiando a bash globalmente. - Usando el bash shebang
#!/bin/bash
en la parte superior de cada guión. Esto requiere que tenga cada trabajo en su propio archivo de secuencia de comandos.
En cualquier caso, debe depurar sus trabajos cron configurándolos para que se ejecuten unos minutos antes antes de considerarlos confiables.
Actualización manual de su Crontab
Si prefiere no administrar su crontab a través de crontab -e
, hay un método mejor que puedes usar. El comando crontab -l
mostrará el contenido de su crontab, y puede canalizarlo a un archivo:
crontab -l > my_crontab
Y luego cargue ese archivo en otro sistema, e ‘instálelo’ con:
crontab my_crontab
De esta manera, no causará ningún error al editarlo directamente, ya que todavía está cargado en cron
.