¿Un archivo oculto? (lo más probable es que sea un guión incorrecto)

¿Un archivo oculto? (lo más probable es que sea un guión incorrecto)

Estoy trabajando en un script ejecutado por Udev al insertar una nueva tarjeta SD en mi Beaglebone Black con Debian Jessie.

Lo primero que me gustaría que hiciera mi script es crear el /media/sdcarddirectorio. Debería ser fácil, pero por alguna oscura razón no funciona...

Aquí está el guión que escribí:

#!/bin/bash -xe
#This script creates the /media/sdcard folder in order to mount the sdcard in it
#Error codes:
# - 2 : /media/sdcard already exist but is not a directory
# - 1 : Failed to create /media/sdcard/

logger -t SDCardscripts 'Entering /root/ServolineScripts/PrepareSDCard.sh script'

if [ -d /media/sdcard ]; then
logger '/media/sdcard is already present. Deleting it.' && rm -rf /media/sdcard;
elif [ -f /media/sdcard ]; then
logger -t SDCardscripts 'A file /media/sdcard already exist! Stopping process, Please look in the /media directory and take a decision with it content'
exit 2
else
logger -t SDCardscripts '/media/sdcard does not exist creating a new one'
fi

mkdir -p /media/sdcard

if [ $? -eq 0 ];then
logger -t SDCardscripts '/media/sdcard directory successfully created';
else
logger -t SDCardscripts 'Failed to create /media/sdcard directory'
exit 1;
fi

logger -t SDCardscripts 'Leaving /root/ServolineScripts/PrepareSDCard.sh script'

Aquí están las líneas de registro generadas cuando conecto una tarjeta SD:

Nov 24 14:06:34 undefined kernel: [ 5546.379851] mmc0: host does not support reading read-only switch, assuming write-enable
Nov 24 14:06:34 undefined kernel: [ 5546.383558] mmc0: new high speed SDHC card at address 0007
Nov 24 14:06:34 undefined kernel: [ 5546.401181] mmcblk0: mmc0:0007 SD08G 7.42 GiB 
Nov 24 14:06:34 undefined rsyslogd-2007: action 'action 17' suspended, next retry is Fri Nov 24 14:07:04 2017 [try http://www.rsyslog.com/e/2007 ]
Nov 24 14:06:34 undefined kernel: [ 5546.413258]  mmcblk0: p1
Nov 24 14:06:34 undefined SDCardscripts: Entering /root/ServolineScripts/PrepareSDCard.sh script
Nov 24 14:06:35 undefined logger: /media/sdcard is already present. Deleting it.
Nov 24 14:06:35 undefined systemd-udevd[2003]: Process '/root/ServolineScripts/PrepareSDCard.sh' failed with exit code 1.
Nov 24 14:06:35 undefined systemd-udevd[2003]: Process '/bin/mount /dev/%K /media/sdcard' failed with exit code 32.

Entonces lo que entiendo es:

  • Udev ingresa en mi script OK
  • Udev comprobó con éxito si existe un archivo
  • Udev falla al ejecutar mkdir

Después de ejecutar este script, intenté:

root@undefined:~/ServolineScripts# cd /media
root@undefined:/media# ls -l
total 0

Sin comentarios...

Finalmente, intenté eliminar las líneas para verificar si /media/sdcard ya existe (todos los primeros if y elif) y en este caso, el proceso falla en la ejecución de mkdir.

Estos síntomas aparecen cuando conecto la µSdcard, pero si ejecuto el script escribiendo bash -xe /root/ServolineScripts/PrepareSDCard, esto es lo que obtengo:

+ logger -t SDCardscripts 'Entering /root/ServolineScripts/PrepareSDCard.sh script'
+ '[' -d /media/sdcard ']'
+ logger '/media/sdcard is already present. Deleting it.'
+ rm -rf /media/sdcard
+ mkdir -p /media/sdcard
+ '[' 0 -eq 0 ']'
+ logger -t SDCardscripts '/media/sdcard directory successfully created'
+ logger -t SDCardscripts 'Leaving /root/ServolineScripts/PrepareSDCard.sh script'

(Y obviamente tuvo éxito al ejecutar mkdir y se creó /media/sdcard/...)

* Si tienes alguna idea sobre dónde está el problema... o algo que pueda ayudarme a depurar esto...*

(Han pasado 4 días en esto... incluso intenté restaurar el Beagle con una nueva imagen... :-( )

PD: Ya vi que los diferentes return que escribí no son el buen comando... si sabes cómo romper un script mientras devuelves un valor, ¡lo tomo! pero este es un segundo tema...

Respuesta1

Su secuencia de comandos se cierra tan pronto como recibe un error porque lo ha bash -ehabilitado.

El comando que falla es rm -rf, porque en el momento en que se ejecuta el script hay un sistema de archivos montado en /media/sdcard.

Ejemplo

# Prepare disk as image
dd if=/dev/zero bs=1M count=100 >100M.img
lo=$(losetup --find --show 100M.img | tee /dev/stderr)
fdisk $lo <<X
n
p
1


w
X
losetup -d $lo
lo=$(losetup --find --show --partscan 100M.img | tee /dev/stderr)

# Create and mount new filesystem
mkfs -t ext4 ${lo}p1
mkdir -p /mnt/dsk
mount ${lo}p1 /mnt/dsk

# Demonstrate trying to remove the directory tree (and failing)
rm -rf /mnt/dsk
echo SS=$?

# All done
umount /mnt/dsk
losetup -d $lo
rm 100M.img

información relacionada