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?
Respuestas:
Los trabajos Cron generalmente se almacenan en un archivo por usuario en
/var/spool/cron
Probablemente, 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/null
es importante para que no reciba elno crontab for username
mensaje 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
sed
u otra herramienta en lugar decat
. Deberías usar elcrontab
comando 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.monthly
directorios y en los archivos/etc/crontab
y/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.d
directorio 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
crontab
archivo es/var/spool/cron/
. Aquí puede encontrar loscrontab
archivos 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.sh
todos los días a la 1 AM.fuente
/var/spool/cron/crontabs/root
en Ubuntu.Los archivos Crontab son simplemente archivos de texto y, como tales, pueden tratarse como cualquier otro archivo de texto. El propósito del
crontab
comando 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 -l
regresa con un1
có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 -l
aún no muestra nada, pero ya no devuelve un error (ya no recibe elno crontab for <user>
mensaje). Entoncesecho
se 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 -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 lo usecat
como 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/crontab
solo 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
grep
u 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
crond
sí 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