script job example ejecutar crear con linux bash cron

linux - job - crontab unix



script bash se ejecuta desde el shell, pero no desde el trabajo cron (5)

La instalación de Cron es vixie-cron

/etc/cron.daily/rmspam.cron

#!/bin/bash /usr/bin/rm /home/user/Maildir/.SPAM/cur/*;

Tengo este sencillo script bash que quiero agregar a un trabajo cron (también incluye comandos de aprendizaje de spam antes) pero esta parte siempre falla con "Archivo o directorio no encontrado". De lo que me imagino es que el metachar no se está interoperando correctamente cuando ejecutar como un trabajo cron. Si ejecuto el script desde la línea de comandos, funciona bien.

Me gustaría un por qué esto no funciona y, por supuesto, una solución de trabajo :)

Gracias

edit # 1 volvió a esta pregunta cuando recibí una insignia de pregunta popular. Primero hice esto,

#!/bin/bash find /home/user/Maildir/.SPAM/cur/ -t file | xargs rm

y hace poco estaba leyendo la página del manual de xargs y lo cambió a este

#!/bin/bash find /home/user/Maildir/.SPAM/cur/ -t file | xargs --no-run-if-empty rm

la opción de xargs cortos es -r


¿Estás especificando la ruta completa al script en el cronjob?

00 3 * * * /home/me/myscript.sh

más bien que

00 3 * * * myscript.sh

En otra nota, es / bin / rm en todos los linux boxes a los que tengo acceso. ¿Ha verificado dos veces que realmente es / usr / bin / rm en su máquina?


Intente usar una opción de fuerza y ​​olvídese de agregar una ruta al comando rm. Creo que no debería ser necesario ...

rm -f

Esto asegurará que incluso si no hay archivos en el directorio, el comando rm no fallará. Si esto es parte de un script de shell, el * debería funcionar. Me parece que podrías tener un directorio vacío ...

Entiendo que el resto del guión se está ejecutando, ¿verdad?


intente agregar

[email protected]

en la parte superior de su archivo cron y debe recibir cualquier entrada / error por correo.

También considere agregar el comando como cronjob

0 30 * * * /usr/bin/rm /home/user/Maildir/.SPAM/cur/*


Si no hay archivos en el directorio, entonces el comodín no se expandirá y se pasará directamente al comando. No hay un archivo llamado "*", y luego el comando falla con "Archivo o directorio no encontrado". Pruebe esto en su lugar:

if [ -f /home/user/Maildir/.SPAM/cur/* ]; then rm /home/user/Maildir/.SPAM/cur/* fi

O simplemente usa el indicador "-f" para rm. El otro problema con este comando es lo que sucede cuando hay demasiado correo no deseado para la longitud máxima de la línea de comando. Algo como esto es probablemente mejor en general:

find /home/user/Maildir/.SPAM/cur -type f -exec rm ''{}'' +

Si tiene un hallazgo antiguo, solo los ejecutivos ejecutan un archivo a la vez:

find /home/user/Maildir/.SPAM/cur -type f | xargs rm

Eso maneja demasiados archivos y no archivos. Gracias a Charles Duffy por señalar la opción + de -exec en find.


¿Está ubicado realmente en /usr/bin/ en su sistema? Siempre he pensado que rm debería residir en /bin/ .