TENGA EN CUENTA : He leído todas las preguntas similares re. cron, rutas, variables env, etc., pero no he encontrado ninguna que ofrezca soluciones a mi problema particular.
Tengo un script que hace algunos volcados de MySQL y luego elimina los antiguos como este:
/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -delete
(el comando anterior ha sido modificado de mi comando original por sugerencias de comentarios )
Sin embargo, los archivos nunca se eliminan cuando cron ejecuta este script. El usuario cron es root.
Notas de depuración
Si ejecuto manualmente el script en el que aparece el comando, los elimina como se esperaba.
Si ejecuto el comando find anterior solo desde la línea de comando como root, los elimina como se esperaba (y con -print devuelve una lista de archivos anteriores a 5 días como se esperaba)
También he agregado una declaración de ruta explícita al crontab de root, pero
eso no cambia nada.Cron no envía ningún error, y si canalizo la operación de búsqueda a un archivo de registro,
aparece vacío o no se crea en absoluto.Estoy usando el servidor Ubuntu 14.04.03 LTS.
/usr/bin/find /home/bkp/dbdump/*.gz -mtime +5
cron
los comandos se ejecutan a través del shell, y el shell expande comodines.cron
debe enviar correos electrónicos con mensajes de salida y error. ¿Recibes algún correo electrónico de este trabajo?Respuestas:
El problema es que
crontab
no se ha$PATH
configurado cuando se ejecuta. En realidad, puede proporcionarle una ruta agregando esto a la parte superior del archivo abierto a través decrontab -e
:(o lo
PATH
que prefieras usar). Esto significa que puede evitar especificar las rutas completas a los comandos, directamente desde cron.Hay múltiples problemas con su comando original. Básicamente le está pidiendo la cáscara para hacer la expansión de comodines, en lugar de
find
. En segundo lugar, no está proporcionando un camino completo pararm
; use/bin/rm
o/usr/bin/rm
, donde sea que esté ubicado en su sistema (veawhich rm
).El primer argumento para encontrar es la "ubicación para buscar", y luego especifica la "consulta de búsqueda" con los diversos
-<option>
s. Entonces, el formato adecuado del comando que desea ejecutar es:o
Si no especifica la
PATH
definición anterior, use:o
fuente
$PATH
configurado, pero será el valor predeterminado del sistema. Esto incluirá/usr/bin
y/bin
, por lo tanto, debería poder encontrar elrm
comando.Intenta esto en su lugar
fuente
-maxdepth 1
.Si invoco el comando find directamente desde el crontab de root y no como parte del script, entonces funciona.
El script en cuestión usa csh. Creo que el entorno cron de root en Ubuntu usará / bin / bash (o / bin / dash?). Quizás esto entra en conflicto de alguna manera con cómo se estaba ejecutando el comando find
De cualquier manera, el problema principal que resolvió, aunque de manera poco elegante.
fuente