Linux en Espanol Espontaneas - De tu ojo a la web
 
Problema Script Linux (tema #22989)
Publicar nuevo tema   Responder al tema    Foros de discusión -> Programación
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Sazu85
Forista


Registrado: 07 Mar 2010
Mensajes: 4

MensajePublicado: Dom Mar 07, 2010 11:56 am    Asunto: Problema Script Linux Responder citando

Buenas,

Resulta que hace un tiempo junto con unos amigos contraté un servidor Kimsufi de 100/100Mbps al que le instalamos un Debian GNU/Linux 5.0.4 (lenny).

El tema está en que llevo ya tiempo intentando crear un script que de alguna forma "Automantenga" el servidor limpio, para que no se llene el espacio del mismo (230GB... aprox). Así que con mis mínimos conocimientos de Linux y mirando mucho scripting he conseguido hacer el siguiente script:

Código:
#       ---------- VARIABLES ----------
#
TEMPORAL="/home/temporal/temporal-utorrent /home/temporal/temporal-amule"
#
PATHFILE="/home/descargas/descargas /home/descargas/DVD /home/descargas/HD /home/descargas/Invitado/Games /home/descargas/Invitado/Musica /home/descargas/Invitado/Pelis /home/descargas/Invitado/Series /home/descargas/Juegos/PC /home/descargas/Juegos/Xbox360 /home/descargas/Juegos/Wii /home/descargas/Musica /home/descargas/Otros /home/descargas/Peliculas /home/descargas/Pelis_de_Culto /home/descargas/Series"
#
LOGFILE="/home/script/log.txt"
#
DATEDASHES="================================================================================="
#
FILEDASHES="---------------------------------------------------------------------------------"
#
#      ---------- FUNCTIONS ---------
#
function deletedate {
  echo $DATEDASHES >> $LOGFILE
  echo "$0 started running at `date`" >> $LOGFILE
  echo $DATEDASHES >> $LOGFILE
}
#
function deletedfiles {
  echo $FILEDASHES >> $LOGFILE
  echo "DELETED FILES" >> $LOGFILE
  echo $FILEDASHES >> $LOGFILE
}
#
function deletedtemporals {
  echo $FILEDASHES >> $LOGFILE
  echo "DELETED TEMPORALS" >> $LOGFILE
  echo $FILEDASHES >> $LOGFILE
}
#
#      ---------- SCRIPTING ----------
#
deletedate
deletedfiles
find $PATHFILE -name "*" -mtime +10 -exec rm -rf '{}' \;
deletedtemporals
find $TEMPORAL -name "*" -mtime +30 >> $LOGFILE;



La idea fundamental de lo anterior es buscar el contenido de los directorios definidos en la variable "PATHFILE" y "TEMPORAL" y borrarlo cuando dicho contenido lleve sin modificarse un tiempo de:

- 10 Días para los contenidos definidos en la variable PATHFILE
- 30 Días para los contenidos definidos en la variable TEMPORAL

Asimismo, generar un log por cada vez que se ejecute el script que guarde precisamente la fecha de cuando se ha ejecutado dicho script y qué es lo que ha borrado.

Todo ello se ejecutará diariamente desde el crontab.

Mis problemas son los siguientes:

1. Quiero borrar todo el contenido del directorio que cumpla la condición anterior, tanto archivos como directorios, pero no el directorio como tal, sin embargo con el siguiente código, también me borra el directorio en el que estoy buscando:

find $PATHFILE -name "*" -mtime +10 -exec rm -rf '{}' \;

2. Quiero mandar el log de lo borrado a la variable $LOGFILE, sin embargo si escribo el siguiente código me aparece un mensaje diciéndome que el código "-exec le falta argumentos":

find $PATHFILE -name "*" -mtime +10 -exec rm -rf '{}' >> $LOGFILE;

De la siguiente forma, sí puedo mantener un log de lo que estoy buscando:

find $TEMPORAL -name "*" -mtime +30 >> $LOGFILE;

Pero en el momento que meto el -exec se fastidia la instrucción.

Me gustaría saber si lo anteriormente comentado es posible y si estoy cometiendo algún tipo de error de sintaxis... Agradecería cualquier tipo de ayuda.

Saludos y Gracias de Antemano!


Ultima edición por Sazu85 el Mie Mar 10, 2010 12:11 am, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado
miguelgf
Forista


Registrado: 28 Dic 2006
Mensajes: 373

MensajePublicado: Lun Mar 08, 2010 11:20 am    Asunto: Responder citando

Hola.

El comando find ya es recursivo por sí mismo. Es mejor que no pongas la opción "-r" en el comando rm dentro del -exec

En cuanto a lo de borrar o no directorios, lo que puedes hacer es ejecutar un script por cada fichero en vez del comando rm. Con eso puedes hacer cuantas comprobaciones quieras. Por ejemplo, copia este código con un nombre de script, por ejemplo borrador.sh, hazlo ejecutable e invócalo en el exec del find dándole como parámetro el '{}'
Código:
#!/bin/bash
LOGFILE=/tmp/mi.log
if [ -d $1 ]; then
echo Encontrado directorio $1. Se omite >> $LOGFILE
else
echo Encontrado fichero $1. Se borra >> $LOGFILE
rm $1 >> $LOGFILE
fi

Si luego quieres refinarlo más, intenta construirlo todo en una línea dentro del exec.
Quedaría algo así:
Código:
find $PATHFILE -name "*" -mtime +10 -exec ./borrador.sh  '{}' ';'


Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Sazu85
Forista


Registrado: 07 Mar 2010
Mensajes: 4

MensajePublicado: Lun Mar 08, 2010 12:22 pm    Asunto: Responder citando

Buenas y gracias por responder,

Entiendo que con el código que has comentado lo que haces es comprobar si el parametro que llega ($1) es un directorio, en dicho caso guardas el log y en caso contrario, es decir, que sea un fichero lo guardas en el log y lo borras.

Código:
#!/bin/bash
LOGFILE=/tmp/mi.log
if [ -d $1 ]; then
echo Encontrado directorio $1. Se omite >> $LOGFILE
else
echo Encontrado fichero $1. Se borra >> $LOGFILE
rm $1 >> $LOGFILE
fi


La verdad es que me has dado una idea, ahora que comentas lo de hacer el borrado y el mantenimiento de logs mediante otro script con un if. ¿Es posible comparar el parámetro con el nombre o la ruta del directorio? De esa forma, le diría en el if si es este directorio entonces no lo borres, sino borralo (ya sea archivo o directorio).

Algo así como:

Código:
if [$1 = "Peliculas"]; then...
fi

Saludos!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
miguelgf
Forista


Registrado: 28 Dic 2006
Mensajes: 373

MensajePublicado: Lun Mar 08, 2010 6:32 pm    Asunto: Responder citando

Hola.

Tal vez podrías intentar excluir el directorio desde el propio find usando expresiones regulares (parámetro -regex), pero ahí yo no podría ayudarte. Tal vez algún otro compañero del foro que sepa más de eso.

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Sazu85
Forista


Registrado: 07 Mar 2010
Mensajes: 4

MensajePublicado: Mie Mar 10, 2010 12:10 am    Asunto: Responder citando

Muchas gracias por todo miguelgf,

Estuve investigando y encontré la forma de excluir nombres en un find. De esta forma se puede borrar lo que hay dentro de un directorio pero no el directorio como tal.

Éste es el código completo del script, está comprobado su correcto funcionamiento.

Código:
#!/bin/bash
# Script Name: Autoclean.sh
# Author Name: Jago
# Date: Sat March 10 1:08:32 JST 2010
# Description: This script will do the following:
#   1. Clean up the following directories where its files havent been modified in the last 10 days:
#   - Descargas
#   - DVD
#   - Games (PC | Wii | Xbox360)
#   - HD
#   - Invitado (Games | Musica | Peliculas | Series)
#   - Musica
#   - Otros
#   - Peliculas
#   - Pelis de Culto
#   - Series
#   2. Clean un the following directories where its files haven been modified in the last 50 days:
#   - Temporal de Utorrent
#   - Temporal de Amule
#   3. Create a log with the deleted files from the directories above.
#
#
#       ---------- VARIABLES ----------
#
TEMPORAL="/home/temporal/temporal-utorrent /home/temporal/temporal-amule"
#
PATHFILE="/home/descargas/descargas /home/descargas/DVD /home/descargas/Games /home/descargas/HD /home/descargas/Invitado /home/descargas/Musica /home/descargas/Otros /home/descargas/Peliculas /home/descargas/Pelis_de_Culto /home/descargas/Series"
#
LOGFILE="/home/script/Borrado.log"
#
DATEDASHES="================================================================================="
#
FILEDASHES="---------------------------------------------------------------------------------"
#
#      ---------- FUNCTIONS ---------
#
function deletedate {
  echo $DATEDASHES >> $LOGFILE
  echo "$0 started running at `date`" >> $LOGFILE
  echo $DATEDASHES >> $LOGFILE
}
#
function deletedfiles {
  echo $FILEDASHES >> $LOGFILE
  echo "DELETED FILES" >> $LOGFILE
  echo $FILEDASHES >> $LOGFILE
}
#
function deletedtemporals {
  echo $FILEDASHES >> $LOGFILE
  echo "DELETED TEMPORALS" >> $LOGFILE
  echo $FILEDASHES >> $LOGFILE
}
#
#      ---------- SCRIPTING ----------
#
deletedate
deletedfiles
find $PATHFILE ! -name "descargas" ! -name "DVD" ! -name "Games" ! -name "HD" ! -name "Invitado" ! -name "Musica" ! -name "Otros" ! -name "Peliculas" ! -name "Pelis_de_Culto" ! -name "Series" ! -name "PC" ! -name "Wii" ! -name "Xbox360" -mtime +15 >> $LOGFILE;
find $PATHFILE ! -name "descargas" ! -name "DVD" ! -name "Games" ! -name "HD" ! -name "Invitado" ! -name "Musica" ! -name "Otros" ! -name "Peliculas" ! -name "Pelis_de_Culto" ! -name "Series" ! -name "PC" ! -name "Wii" ! -name "Xbox360" -mtime +15 -print0 | xargs -0 rm -rf;
deletedtemporals
find $TEMPORAL ! -name "temporal-amule" ! -name "temporal-utorrent" -mtime +30 >> $LOGFILE;
find $TEMPORAL ! -name "temporal-amule" ! -name "temporal-utorrent" -mtime +30 -print0 | xargs -0 rm -rf;


Saludos!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
miguelgf
Forista


Registrado: 28 Dic 2006
Mensajes: 373

MensajePublicado: Vie Mar 12, 2010 12:36 am    Asunto: Responder citando

Hola.
Hay varias cositas que tal vez te merezca la pena revisar, aunque son cosa de gustos no de errores.

Sazu85 escribió:

LOGFILE="/home/script/Borrado.log"

Ese código te va a construir unos ficheros de log enormes a medida que tu script se ejecute una y otra vez. Si los logs los va a procesar un programa no importa, pero si los va a leer una persona, por ejemplo tú, se vuelve muy engorroso el manejo de ficheros demasiado grandes. Tal vez te interese mejor tener un fichero por cada ejecucion, metiendo la fecha y hora en el nombre, lo que se haría así:
Código:
LOGFILE="/home/script/Borrado.$(date +%Y-%m-%d.%H_%M).log"

Por otra parte veo en este código:
Sazu85 escribió:

find $TEMPORAL ! -name "temporal-amule" ! -name "temporal-utorrent" -mtime +30 >> $LOGFILE;
find $TEMPORAL ! -name "temporal-amule" ! -name "temporal-utorrent" -mtime +30 -print0 | xargs -0 rm -rf;[/code]

que repites el mismo comando dos veces, una para dejar el resultado en el log y otra para ejecutar el borrado. Eso tiene dos problemas. Uno es de mantenimiento; cada vez que cambies algo debes hacerlo igual en ambas órdenes. Eso cuando se va con prisas no siempre se hace y al final tienes como resultado un log que no es totalmente ajustado a la realidad con lo que dependiendo del problema que quieras consultar en el log puede que éste te ayude o que te entorpezca. Por otra parte, si da la casualidad de que entre que se ejecuta el primer comando y el segundo se cumple que un fichero pasa a tener la antigüedad justa, no estará en el log pero sí en el borrado. Es un caso difícil pero posible y no está mal tenerlo en cuenta.
Ambas cosas podrías arreglarlas con el comando "tee". tee toma como entrada la entrada estándar y la lleva a un fichero y además la lleva a la salida estándar. Con eso puedes hacer que la salida del find vaya tanto a tu fichero de log como a la entrada del xargs. Sería algo así:
Código:
find $TEMPORAL ! -name "temporal-amule" ! -name "temporal-utorrent" -mtime +30 -print0 | tee -a $LOGFILE | xargs -0 rm -f

Y por último te recomiendo otra vez que no uses la opción -r del comando rm si sabes que cada ejecución del rm lleva exactamente el nombre del fichero a borrar y el que te está aportando la recursividad es el propio find.

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Sazu85
Forista


Registrado: 07 Mar 2010
Mensajes: 4

MensajePublicado: Dom Mar 14, 2010 9:15 pm    Asunto: Responder citando

Buenas y gracias por responder,

Voy a seguir las recomendaciones que me has comentado.

Tanto para el archivo log como para el comando del find, a ver si esta noche (lo tengo en el crontab para que se ejecute todas las noches a las 3.00 AM).

De todas formas, he tenido que utilizar el comando -r en el borrado ya que de no hacerlo no me borra los archivos que son directorios, imagínate en la carpeta series una que se llame Lost y debajo haya varios capítulos, quiere que borre tanto la carpeta como los capítulos y al quitar el -r no borra la carpeta.

Saludos y muchas gracias!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Publicar nuevo tema   Responder al tema    Foros de discusión -> Programación Todas las horas son GMT
Página 1 de 1

 
Cambiar a:  
Puede publicar nuevos temas en este foro
No puede responder a temas en este foro
No puede editar sus mensajes en este foro
No puede borrar sus mensajes en este foro
No puede votar en encuestas en este foro




La marca registrada Linux (R) se usa siguiendo la sublicensia obtenida del "Linux Mark Institute",
el LICENCIATARIO exclusivo de Linus Torvalds, propietario de la marca en EEUU y otros países
The registered trademark Linux (R) is used pursuant to a sublicense from the Linux Mark Institute,
the exclusive LICENSEE of Linus Torvalds, owner of the mark in the U.S. and other countries
Powered by phpBB © 2001, 2002 phpBB Group

Contactos - Doraemon Games - Horse Games - Golf Games - Dog Games - Bird Games - SpongeBob Games - Pet Games