2011-02-02 30 views
85

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.Cómo creo un crontab a través de un script

¿Es posible hacerlo?

+0

https://stackoverflow.com/questions/610839/how-can-i-programmatically-create-a-new-cron-job – dskrvk

+1

Posible duplicado de [¿Cómo puedo crear mediante programación un nuevo trabajo cron?] (Http : //stackoverflow.com/questions/610839/how-can-i-programmatically-create-a-new-cron-job) – Twonky

+0

Si está buscando modificar o eliminar una entrada de crontab, vea mi solución a continuación. –

Respuesta

8

Cron puestos de trabajo por lo general se almacenan en un archivo por usuario en/var/spool/cron

Lo más sencillo para que hagas es probable que sólo crear un archivo de texto con el trabajo configurado, a continuación, copiarlo en el carpeta cron spool y asegúrese de que tenga los permisos correctos.

+12

Modificar los archivos directamente en/var/spool/cron está mal visto. De hecho, si mira los archivos que están allí, generalmente contendrán advertencias tales como "NO EDITAR ESTE ARCHIVO" como la primera línea. – Jared

+6

@Jared Aunque estoy totalmente de acuerdo con la idea, decir que "está mal visto" no ayuda mucho. Más bien, indique qué otro archivo debe editarse, si lo hay, o explique los riesgos de editar archivos manualmente. Estoy planeando crear algunos trabajos cron a través de la línea de comando automatizada, y si la edición de este archivo es la única opción, y sin efectos secundarios significativos, no veo por qué no debería usarlo. – Balmipour

+11

Desplácese hacia abajo para obtener la respuesta real. –

1

Bueno /etc/crontab simplemente un archivo ASCII por lo que la más sencilla es simplemente

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

que agregará un trabajo que un e-mail cada 15 minutos. Ajuste a gusto, y pruebe a través de grep o por otros medios si la línea ya se agregó para hacer que su secuencia de comandos sea idempotente.

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

+1

Creo que técnicamente no se requiere crond para monitorear los cambios a crontab, incluso si en realidad la mayoría de las implementaciones lo hacen, así que recomendaría una llamada a crontab -e luego para probarlo. crontab -e hace honor a la variable EDITOR si la memoria funciona, por lo que establecerla en/bin/true por el momento debería obligar a volver a leer el crontab. –

+1

Cierto en cualquier sistema Linux reciente 'crond' * does * monitor, y ciertamente lo hace en la plataforma indicada de OP. –

+0

Solo si eres root y quieres que el script se ejecute como root. Eso podría no ser deseable en el caso de OPs. – Keith

21

En Ubuntu y muchas otras distribuciones, puede simplemente poner un archivo en el directorio /etc/cron.d que contiene una sola línea con una entrada válida crontab. 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 soltar archivos en /etc/cron.hourly, /etc/cron.monthly y /etc/cron.weekly.

+1

Pero debe ser root para hacer esto. – Keith

12

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 utilizar para especificar un crontab almacenado en un archivo. Como crontab -e, esto solo instalará el archivo si no tiene errores.

Por lo tanto, una secuencia de comandos 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.

+0

Para noobs como yo, tenga en cuenta que es 'crontab [ruta de archivo]'. Definitivamente fue la mejor opción para mí, ya que permite un código más legible. Utilizo crontab para rastrear paquetes y cambiar mi fondo de escritorio con el estado. Cuando no estoy esperando paquetes, no necesita verificar cada hora. Es por eso que quería que el guión editara automáticamente la frecuencia cron. – Rasmus

+0

@Rasmus Suena como un guión impresionante que me encantaría poder robar. ¿Alguna posibilidad de compartir a través de una esencia o similar? – cledoux

44

Para crontabs usuario (incluidas las raíces), se puede hacer algo como:

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

donde el archivo llamado "nombre de archivo" contiene objetos a anexar. También puede hacer la manipulación de texto usando sed u otra herramienta en lugar de cat. Debe usar el comando crontab en 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, los que se puede manipular como lo haría con archivos de texto normales.Están almacenados 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.

+0

Parecía prometedor pero probando el segundo enfoque (con 'echo'), obtuve" crontab: error de uso: debe especificarse el nombre del archivo para reemplazarlo ". La página del hombre de Cron muestra la sintaxis como 'archivo crontab [-u usuario]', es decir, con un nombre de archivo obligatorio. ¿Hay algún truco para que acepte los datos canalizados? –

+1

@MarkBerry: lo siento. En una tubería, se debe usar un guión para indicar que la entrada proviene de 'stdin'. Voy a corregir mi respuesta. –

206

Aquí hay una sola línea que no utiliza/requerir el nuevo trabajo de estar en un archivo:

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

El 2>/dev/null es importante para que usted no recibe el mensaje de que algunos no crontab for username * nix producir si actualmente no hay entradas de crontab.

+8

Esta debería ser la respuesta aceptada. Solo necesito una forma ahora para verificar si el one-liner que pretendo agregar ya está allí o no ... – ChrisPrime

+6

... oh, espera, así es como comprobar si hay algo en el crontab de mi usuario antes de agregarlo con un script: http://stackoverflow.com/a/14451184/3686125 – ChrisPrime

+1

si este script está destinado a ser un comando que debe repetirse y modificar una tarea cron existente, podría ser bueno reemplazar la línea existente en crontab. Se pueden usar varios marcadores para controlar diferentes tareas cron (control-marcador-1, control-marcador-2, etc.): (crontab -l 2>/dev/null | grep -v control-marcador-1; echo '*/5 * * * */path/to/job -with args # control-marker-1' | crontab - – chef

2

Como corrección a los que sugieren 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é). Los viejos SUSE añaden líneas de comentario a la salida crontab -l, lo que hace que crontab -l | crontab - no sea idempotente (Debian reconoce este problema en la página de crontab y parchó su versión de Vixie Cron para cambiar el comportamiento predeterminado de crontab -l).

Para editar crontabs mediante programación en sistemas donde crontab -l añade comentarios, puede intentar lo siguiente:

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

EDITOR=cat dice crontab para utilizar cat como editor (no la vi por defecto habitual), que doesn' t cambie el archivo, pero en su lugar lo copia a stdout. Esto aún podría fallar si crontab - espera una entrada en un formato diferente de las salidas crontab -e. No intente reemplazar el crontab - final con crontab -e - no funcionará.

11

respuesta aún más sencilla que le pregunta sería:

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

Usted puede cronjobs configuración en servidores remotos como a continuación:

#!/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.

+1

que es la respuesta más simple, ¡gracias! – carlomas

1

He escrito una herramienta de despliegue crontab en Python: https://github.com/monklof/deploycron

pip install deploycron 

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

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

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 cron, use esto:

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

que darse cuenta de que esto no es lo Gaurav pedía, pero ¿por qué no tener todas las soluciones en un solo lugar?

Cuestiones relacionadas