Tengo una secuencia de comandos de implementación, debe agregar algo a un usuario crontab
(desencadenar una secuencia de comandos que limpie los registros cada XXX días), sin embargo, esto solo debe hacerse durante la primera implementación o cuando debe actualizarse.
(Puedo correr xxx.py deploy env
o xxx.py update env
)
así que tengo que hacer esto:
Check if my cronJob already exist
Put my cronJob if it does not already exist
or
update my cronjob if one of the parameter of the command is different
No veo cómo agregar / verificar / eliminar algo crontab
sin usar crontab -e
o editar el crontab
archivo (descargarlo, reescribirlo, volver a cargarlo)
PD: este es un cronjob específico del usuario, "webadmin" lo va a hacer y no debe usar sudo para hacerlo.
/etc/cron.d
? Si es así, coloque su script allí usando un nombre único para su aplicación/etc/crontab
, los archivos/etc/cron.d/
tienen un campo adicional para el nombre de usuario, inmediatamente después de la especificación de programación. por ej* * * * * username /path/to/script
. Verman 5 crontab
y buscarSYSTEM CRON
.Respuestas:
mi mejor idea hasta ahora
para verificar primero si el contenido coincide con lo que debería estar allí y solo actualizar si no:
pero esto se complica lo suficiente como para construir un script separado alrededor de esa tarea cron.
otras ideas
puede enviar la cadena a través de stdin a crontab (tenga cuidado, esto borra cualquier entrada crontab anterior):
esto incluso debería funcionar a través de ssh:
si desea agregar al archivo, puede usar esto:
fuente
echo '*...
expandí*
a una lista de archivos. 2) las terminaciones de línea en el crontab se eliminaron.echo "*...
y 2) eliminarecho $
desde el inicio de la línea.Para el registro que voy a sugerir usar
/etc/cron.d/
. Solo el root puede escribir archivos aquí, pero las entradas se pueden ejecutar como cualquier usuario (sin necesidad de hacerlosudo
).Esto se puede aplicar varias veces, actualizando el
webadmin.cron
archivo local según sea necesario antes de copiarlo.Incluso puede eliminar el aprovisionamiento:
Tenga en cuenta que en muchos casos no puede proporcionar la contraseña de root para los comandos
scp
/ssh
. En su lugar, debe haber configurado certificados de clave pública / privada. Además, por implicación, la cuenta local (sea lo que sea) tendrá acceso raíz completo al servidor remoto. No está claro en este momento si eso sería un obstáculo para su escenario específico.fuente
/etc/cron.d/
existe exactamente para este propósito, de modo que los paquetes / implementaciones pueden simplemente soltar un archivo crontab aquí.Recomiendo encarecidamente usar Ansible * para esto en lugar de rodar el suyo. O Puppet o Chef, pero Ansible es ideal para scripts de implementación de infraestructura cero como este.
Esto se debe a que ya hay módulos destinados a resolver problemas como este, y las herramientas de administración de configuración tienen la idempotencia como un objetivo de diseño básico: esa es la propiedad de cambiar solo cuando es necesario, incluso si lo ejecuta accidentalmente (o intencionalmente) nuevamente.
En particular, el módulo cron de Ansible puede modificar crontabs de usuario. Como beneficio adicional, si luego desea ajustar para usar crontabs del sistema, será un ajuste muy fácil en lugar de una reescritura.
* descargo de responsabilidad: trabajo para Red Hat, y Ansible es un proyecto patrocinado por Red Hat.
fuente
Si desea agregar un trabajo cron a través de la cuenta de destino, ejecute
crontab -e
. Este comando pasa el crontab a través de un editor. Dígale que use un comando de editor que modifique el crontab como desee. El comando del editor se ejecuta como un fragmento de shell con el nombre de un archivo temporal adjunto.Este enfoque es más confiable que el nativo
crontab -l | … | crontab -
porque este es vulnerable a una condición de carrera si el crontab se edita simultáneamente: las modificaciones realizadas entre la llamada acrontab -l
y la llamada acrontab -
se deshacerían.fuente
Esta es una adaptación de lo que ofreció @ phillip-zyan-k-lee-stockmann , basado en su código de "Mejor idea hasta ahora".
Mis cambios de su (fragmento excelente y útil) son básicamente:
Y aquí está mi código para lo que llamé
crontab-add-hourly.sh
:Ejemplo de uso y salida:
fuente
TL; DR: Esto realmente funciona, probado en Bash 4.4.
Como se señaló en los comentarios de @Phillip -Zyan K Lee- Stockmann, esa solución se expande
*
en todos los archivos en el directorio actual. No pude obtener la sugerencia de los comentarios para trabajar. set -f desactiva la expansión de comodines, consulte https://stackoverflow.com/a/11456496/915441 .fuente