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

Respuestas:
Los trabajos Cron generalmente se almacenan en un archivo por usuario en
/var/spool/cronProbablemente, lo más sencillo es crear un archivo de texto con el trabajo configurado, luego copiarlo en la carpeta de spool cron y asegurarse de que tenga los permisos correctos (600).
fuente
Aquí hay una línea que no usa / no requiere que el nuevo trabajo esté en un archivo:
Esto
2>/dev/nulles importante para que no reciba elno crontab for usernamemensaje que producen algunos * nixes si actualmente no hay entradas de crontab.fuente
echo -e "$(sudo crontab -u root -l)\n* * * * * echo hello > /home/danny/temp.log 2>&1" | sudo crontab -u root -Espero que esto ayude a alguienPara los crontabs de usuario (incluida la raíz), puede hacer algo como:
donde el archivo llamado "nombre de archivo" contiene elementos para agregar. También puede hacer manipulación de texto usando
sedu otra herramienta en lugar decat. Deberías usar elcrontabcomando en lugar de modificar directamente el archivo.Una operación similar sería:
Si está modificando o creando crontabs del sistema, estos pueden manipularse como lo haría con los archivos de texto normales. Se almacenan en los
/etc/cron.d,/etc/cron.hourly,/etc/cron.daily,/etc/cron.weekly,/etc/cron.monthlydirectorios y en los archivos/etc/crontaby/etc/anacrontab.fuente
echo), obtuve "crontab: error de uso: se debe especificar el nombre del archivo para reemplazarlo". La página de manual de Cron muestra la sintaxis comocrontab [ -u user ] file, es decir, con un nombre de archivo obligatorio. ¿Hay algún truco para que acepte los datos canalizados?stdin. Corregiré mi respuesta.En Ubuntu y muchas otras distribuciones, solo puede poner un archivo en el
/etc/cron.ddirectorio que contiene una sola línea con un crontab válido entrada . No es necesario agregar una línea a un archivo existente.Si solo necesita algo para ejecutar diariamente, simplemente coloque un archivo
/etc/cron.daily. Del mismo modo, también se puede soltar archivos en/etc/cron.hourly,/etc/cron.monthly, y/etc/cron.weekly.fuente
Una respuesta aún más simple a su pregunta sería:
Puede configurar cronjobs en servidores remotos de la siguiente manera:
En Linux, la ubicación predeterminada del
crontabarchivo es/var/spool/cron/. Aquí puede encontrar loscrontabarchivos de todos los usuarios. Solo necesita agregar su entrada de cronjob al archivo del usuario respectivo. En el ejemplo anterior, el archivo crontab del usuario raíz se agrega con un cronjob para ejecutarse/root/test.shtodos los días a la 1 AM.fuente
/var/spool/cron/crontabs/rooten Ubuntu.Los archivos Crontab son simplemente archivos de texto y, como tales, pueden tratarse como cualquier otro archivo de texto. El propósito del
crontabcomando 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 verifica 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 igualcrontab -e, esto solo instalará el archivo si está libre de errores.Por lo tanto, un script puede escribir directamente archivos de pestaña cron o escribirlos en un archivo temporal y cargarlos con el
crontab [path to temp file]comando. Escribir directamente ahorra tener que escribir un archivo temporal, pero también evita la verificación de seguridad.fuente
crontab [path to file]... Esta fue definitivamente la mejor opción para mí, ya que permite un código más legible. Uso crontab para rastrear paquetes y cambiar el fondo de escritorio con el estado. Cuando no espero paquetes, no es necesario verificar cada hora. Es por eso que quería que el script editara automáticamente la frecuencia cron.(No tengo suficiente reputación para comentar, así que estoy agregando como respuesta: siéntase libre de agregarlo como comentario junto a su respuesta)
El one-liner de Joe Casadonte es perfecto, excepto si corres con
set -e, es decir, si su script está configurado para fallar en caso de error, y si todavía no hay cronjobs. En ese caso, el one-liner NO creará el cronjob, pero NO detendrá el script. El fracaso silencioso puede ser muy engañoso.La razón es que
crontab -lregresa con un1código de retorno, causando el siguiente comando (elecho) no se ejecute ... por lo tanto, el cronjob no se crea. Pero como se ejecutan como un subproceso (debido al paréntesis), no detienen el script.(Curiosamente, si ejecuta el mismo comando nuevamente, funcionará: una vez que haya ejecutado
crontab -una vez,crontab -laún no muestra nada, pero ya no devuelve un error (ya no recibe elno crontab for <user>mensaje). Entoncesechose ejecuta el siguiente y se crea el crontab)En cualquier caso, si corre con
set -e, la línea debe ser:fuente
Como corrección para aquellos 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 ejecutan una versión anterior SUSE (no pregunte por qué). Los antiguos SUSE anteponen líneas de comentarios a la salida decrontab -l, haciendo quecrontab -l | crontab -no sean idempotentes (Debian reconoce este problema en la página de manual de crontab y parcheó su versión de Vixie Cron para cambiar el comportamiento predeterminado decrontab -l).Para editar crontabs mediante programación en sistemas donde
crontab -lagrega comentarios, puede intentar lo siguiente:EDITOR=cat crontab -e > old_crontab; cat old_crontab new_job | crontab -EDITOR=catle dice a crontab que lo usecatcomo editor (no el vi predeterminado habitual), que no cambia el archivo, sino que lo copia en stdout. Esto aún podría fallar sicrontab -espera una entrada en un formato diferente de lo que salecrontab -e. No intente reemplazar el finalcrontab -concrontab -e- no funcionará.fuente
Bueno,
/etc/crontabsolo un archivo ASCII, así que lo más simple esque agregará un trabajo que le enviará un correo electrónico cada 15 minutos. Ajuste al gusto y pruebe a través de
grepu otro medio si la línea ya se agregó para hacer que su script sea idempotente.En Ubuntu et al, también puede colocar archivos en los
/etc/cron.*que es más fácil de hacer y probar --- además no se mete con archivos de configuración (del sistema) como/etc/crontab.fuente
crondsí lo hace , y ciertamente lo hace en la plataforma declarada del OP.Aquí se explica cómo modificar cron una entrada sin editar directamente el archivo cron (que está mal visto).
Si desea eliminar una entrada cron, use esto:
Me doy cuenta de que esto no es lo que Gaurav estaba pidiendo, pero ¿por qué no tener todas las soluciones en un solo lugar?
fuente
He escrito una herramienta de implementación de crontab en python: https://github.com/monklof/deploycron
Instalar su crontab es muy fácil, esto fusionará el crontab en el crontab existente del sistema.
fuente
Es un enfoque para agregar incrementalmente el trabajo cron:
fuente