ver tareas rango programadas minutos manualmente job instalar horas ejemplos ejecutar crear cada linux shell ubuntu cron crontab

linux - tareas - instalar crontab ubuntu



¿Cómo creo un crontab a través de un script? (10)

Necesito agregar un trabajo cron a través de un script que ejecuto para configurar un servidor. Actualmente estoy usando Ubuntu. Puedo usar crontab -e pero eso abrirá un editor para editar el crontab actual. Quiero hacer esto programáticamente.

¿Es posible hacerlo?


Aquí hay una línea que no usa / requiere que el nuevo trabajo esté en un archivo:

(crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -

El 2>/dev/null es importante para que no crontab for username mensaje no crontab for username que algunos * nixes producen si actualmente no hay entradas crontab.


Aquí se explica cómo modificar una entrada de cron sin editar directamente el archivo cron (lo cual es desaprobado).

crontab -l -u <user> | sed ''s/find/replace/g'' | crontab -u <user> -

Si desea eliminar una entrada de cron, use esto:

crontab -l -u <user> | sed ''/find/d'' | crontab -u <user> -

Me doy cuenta de que esto no es lo que estaba pidiendo gaurav, pero ¿por qué no tener todas las soluciones en un solo lugar?


Bueno /etc/crontab solo un archivo ASCII, así que lo más simple es solo

echo "*/15 * * * * root date" >> /etc/crontab

que agregará un trabajo que le enviará por correo electrónico cada 15 minutos. Ajústelo al gusto, y pruebe a través de grep u otro medio si la línea ya se agregó para que el guión sea idempotente.

En Ubuntu et al., También puede colocar archivos en /etc/cron.* que es más fácil de hacer y probar, además de no interferir con archivos de configuración (del sistema) como /etc/crontab .


Como una corrección para aquellos que sugieren crontab -l | crontab - crontab -l | crontab - : Esto no funciona en todos los sistemas. Por ejemplo, tuve que agregar un trabajo al crontab raíz en docenas de servidores que ejecutaban una versión anterior de SUSE (no preguntes por qué). Old SUSE antependen las líneas de comentario a la salida de crontab -l , haciendo crontab -l | crontab - crontab -l | crontab - no idempotente (Debian reconoce este problema en la página de manual de crontab y parchó su versión de Vixie Cron para cambiar el comportamiento predeterminado de crontab -l ).

Para editar crontabs programáticamente en sistemas donde crontab -l agrega comentarios, puede intentar lo siguiente:

EDITOR=cat crontab -e > old_crontab; cat old_crontab new_job | crontab -

EDITOR=cat le dice a crontab que use cat como editor (no el valor por defecto habitual vi), que no cambia el archivo, sino que lo copia a stdout. Esto aún puede fallar si crontab - espera la entrada en un formato diferente de lo que crontab -e produce. No intente reemplazar el crontab - final crontab - con crontab -e - no funcionará.


En Ubuntu y en muchas otras distribuciones, puede simplemente colocar un archivo en el directorio /etc/cron.d contiene una sola línea con una entrada de crontab válida. No es necesario agregar una línea a un archivo existente.

Si solo necesita algo para ejecutar a diario, simplemente coloque un archivo en /etc/cron.daily . Del mismo modo, también puede colocar los archivos en /etc/cron.hourly , /etc/cron.monthly y /etc/cron.weekly .


Escribí una herramienta de implementación crontab en python: https://github.com/monklof/deploycron

pip install deploycron

Instalar su crontab es muy fácil, esto fusionará el crontab en el crontab existente del sistema.

from deploycron import deploycron deploycron(content="* * * * * echo hello > /tmp/hello")


Los archivos de Crontab son simplemente archivos de texto y, como tales, se pueden tratar como cualquier otro archivo de texto. El propósito del comando crontab es hacer que la edición de archivos crontab sea más segura. Cuando se edita a través de este comando, el archivo se comprueba en busca de errores y solo se guarda si no hay ninguno.

crontab [path to file] se puede usar para especificar un crontab almacenado en un archivo. Al igual que crontab -e , esto solo instalará el archivo si no tiene errores.

Por lo tanto, un script puede escribir directamente los archivos cron tab, o escribirlos en un archivo temporal y cargarlos con el comando crontab [path to temp file] . Escribir directamente ahorra tener que escribir un archivo temporal, pero también evita la verificación de seguridad.


Los trabajos cron normalmente se almacenan en un archivo por usuario en / var / spool / cron

Lo más simple para usted es, probablemente, simplemente crear un archivo de texto con el trabajo configurado, luego copiarlo a la carpeta cron spool y asegurarse de que tenga los permisos correctos.


Para crontabs de usuario (incluida la raíz), puede hacer algo como:

crontab -l -u user | cat - filename | crontab -u user -

donde el archivo llamado "nombre de archivo" contiene elementos para anexar. También puede hacer la manipulación de texto usando sed u otra herramienta en lugar de cat . Debe usar el comando crontab lugar de modificar directamente el archivo.

Una operación similar sería:

{ crontab -l -u user; echo ''crontab spec''; } | crontab -u user -

Si está modificando o creando crontabs del sistema, estos pueden ser manipulados como lo haría con los archivos de texto ordinarios. Se almacenan en los directorios /etc/cron.d , /etc/cron.hourly , /etc/cron.daily , /etc/cron.weekly , /etc/cron.monthly y en los archivos /etc/crontab y /etc/anacrontab .


Una respuesta aún más simple a tu pregunta sería:

echo "0 1 * * * /root/test.sh" | tee -a /var/spool/cron/root

Puede configurar cronjobs en servidores remotos de la siguiente manera:

#!/bin/bash servers="srv1 srv2 srv3 srv4 srv5" for i in $servers do echo "0 1 * * * /root/test.sh" | ssh $i " tee -a /var/spool/cron/root" done

En Linux, la ubicación predeterminada del archivo crontab es /var/spool/cron/ . Aquí puede encontrar los archivos crontab de todos los usuarios. Solo necesita agregar su entrada cronjob al archivo del usuario respectivo. En el ejemplo anterior, el archivo crontab del usuario raíz se adjunta con un cronjob para ejecutar /root/test.sh todos los días a la 1 AM.