Para ello lo primero que he creado ha sido el script que inicializará y detendrá el demonio; un script que incluiremos en el directorio /etc/init.d para que, en caso de ser necesario, se inicializará automáticamente el arranque. A dicho script lo he llamado demonio_dcompres.sh y tendría el siguiente contenido:
- #!/bin/bash
- ### BEGIN INIT INFO
- # Provides: dcompres
- # Required-Start: $network $named $remote_fs $syslog
- # Required-Stop: $network $named $remote_fs $syslog
- # Default-Start: 2 3 4 5
- # Default-Stop: 0 1 6
- # Short-Description: dcompres
- # Description: Descompresor automatico
- ### END INIT INFO
- PIDFILE=/tmp/dcompres.pid
- SRV="dcompres"
- function status()
- if [ -f ${PIDFILE} ];
- then
- echo "${SRV} esta en marcha"
- else
- echo "${SRV} esta parado"
- fi
- function start(){
- echo -n $"Iniciando servicio ${SRV}: "
- /usr/bin/dcompres >/dev/null 2>&1 &
- RETVAL=$?
- echo $! > $PIDFILE
- if [ ${RETVAL} -eq 0 ];
- then
- echo "Se ha iniciado ${SRV}"
- else
- echo "No se ha podido iniciar ${SRV}"
- fi
- echo
- }
- function stop(){
- echo -n $"Parando servicio ${SRV}... "
- SERV=$(ps -e |grep ${SRV} |awk '{print $1}')
- kill -9 ${SERV}
- echo "Servicio detenido"
- }
- function restart(){
- stop
- sleep 10
- start
- }
- case "$1" in
- start)
- start
- ;;
- stop)
- stop
- ;;
- restart)
- restart
- ;;
- status)
- status
- ;;
- *)
- echo $"Usar: $0 {status|start|stop|restart}"
- exit 1
- esac
- exit 0
Si observáis bien, este script controla otro llamado /usr/bin/dcompres, script que controlaremos como un servicio gracias a este script añadido en init.d. Dicho script puede ser más o menos complicado dependiendo de nuestras necesidades; en este caso he creado un script bastante completo que intenta contemplar diferentes posibilidades, que sería el siguiente
- #!/bin/bash
- #BUCLE INFINTO HASTA QUE LO PAREMOS
- ACTIVE='y'
- DIRECTORIO='/home/ivan/Descargas/'
- while [ ${ACTIVE} == 'y' ];
- do
- cd $DIRECTORIO
- ls $DIRECTORIO |grep ".tar" > /tmp/descom.txt
- ls $DIRECTORIO |grep ".bz2" >> /tmp/descom.txt
- ls $DIRECTORIO |grep ".gz" >> /tmp/descom.txt
- ls $DIRECTORIO |grep ".rar" >> /tmp/descom.txt
- ls $DIRECTORIO |grep ".zip" >> /tmp/descom.txt
- while read FICHERO
- do
- FICHERO2=`echo $FICHERO | sed 's/ /_/g'`
- if [ "$FICHERO" != "$FICHERO2" ];
- then
- mv "$FICHERO" $FICHERO2
- fi
- #TAR
- if [ $(ls $DIRECTORIO$FICHERO2 | rev | cut -d'.' -f 1 | rev) == "tar" ];
- then
- tar -xvf $FICHERO2
- rm ${FICHERO2}
- #BZ2 Y TAR.BZ2
- elif [ $(ls $DIRECTORIO$FICHERO2 | rev | cut -d'.' -f 1 | rev) == "bz2" ];
- then
- if [ $(ls $DIRECTORIO$FICHERO2 | rev | cut -d'.' -f 2 | rev) == "tar" ];
- then
- tar -xjf $FICHERO2
- else
- bzip2 -d $FICHERO2
- fi
- rm ${FICHERO2}
- #GZ Y TAR.GZ
- elif [ $(ls $DIRECTORIO$FICHERO2 | rev | cut -d'.' -f 1 | rev) == "gz" ];
- then
- if [ $(ls $DIRECTORIO$FICHERO2 | rev | cut -d'.' -f 2 | rev) == "tar" ];
- then
- tar -xzf $FICHERO2
- else
- gzip -d $FICHERO2
- fi
- rm ${FICHERO2}
- #RAR
- elif [ $(ls $DIRECTORIO$FICHERO2 | rev | cut -d'.' -f 1 | rev) == "rar" ];
- then
- rar -x $FICHERO2
- rm ${FICHERO2}
- #ZIP
- elif [ $(ls $DIRECTORIO$FICHERO2 | rev | cut -d'.' -f 1 | rev) == "zip" ];
- then
- unzip $FICHERO2
- rm ${FICHERO2}
- fi
- done < /tmp/descom.txt
- done
En este script hay un par de puntos "especiales" que en mi opinión merecen la pena ser mencionados. El primer punto sería el uso de la variable FICHERO2 con sed. Por si no encontraseis dicha línea os la pondré a continuación:
- FICHERO2=`echo $FICHERO | sed 's/ /_/g'`
- if [ "$FICHERO" != "$FICHERO2" ];
- then
- mv "$FICHERO" $FICHERO2
- fi
Esta acción tiene un motivo en concreto. Imaginemos que el fichero comprimido que tenemos en el directorio contiene espacios; dichos espacios no dejará trabajar con el fichero adecuadamente, así que lo primero que haríamos sería transformar los espacios en blanco en _. Obviamente, revisaríamos si el fichero tendría espacios para evitar renombrar el fichero en vano; he ahí el motivo del if. El comando de sustitución tiene la sintaxis:
FICHERO_NUEVO=`echo$FICHERO_ORIGINAL|sed's/CADENA_ORIGINAL/CADENA_NUEVA/g'`
Otro punto que a tener en cuenta en el que probablemente os habréis fijado es que hago uso del parámetro |rev en las condiciones introducidas. El uso de dicho rev es debido a que con ello nos aseguraremos que siempre contará los puntos desde el final del fichero y no desde el principio; puntos que uso en este script como referencia para obtener el tipo de compresión (zip, tar, rar...). Esto es debido a que existen muchos ficheros que contienen la versión junto con su nombre (ejemplo nmap-7.12.tar.bz2) y siempre querremos asegurarnos que contaremos el último o penúltimo punto (dependiendo de nuestra necesidad), independientemente de los puntos que hayamos encontrado antes. La sintaxis sería:
ls fichero |rev|cut-d'.'-f(número_posición_desde_el_final)|rev
Si pusiésemos un 1, haríamos referencia a la última posición, mientras que con un 2 haríamos referencia a la penúltima y así sucesivamente...
Con esto tendríamos un script muy sencillo y funcional que hará que las dificultades de una tarea de descompresión, sean tareas del pasado.
Espero que os haya resultado útil.
Saludos.