Problema al desmontar una imagen de disco con un script... ¡pero no manualmente!

Problema al desmontar una imagen de disco con un script... ¡pero no manualmente!

Es mi primera experiencia escribiendo scripts de shell y está sucediendo algo curioso. Estoy trabajando en un sistema integrado y quería que mi script test5.sh se colocara en la carpeta /root del sistema invitado para montar la primera partición de una imagen de tarjeta eMMC, realizar una prueba en ella, eliminar los archivos creados por test1, Elimine el proceso que aún accede a la tarjeta [para evitar recursos ocupados, en mi caso siempre hay un solo proceso desde el comando del fusor] y finalmente quiero desmontar la tarjeta. Esto es lo que escribí:

#!/bin/sh

cd ../dev
e2fsck mmcblk0p1
mount -t auto mmcblk0p1 ../mnt
cd ../mnt
./../bin/test1
rm file*
variable=$(fuser -m /mnt)
echo $variable
kill -9 $variable
echo "Before the problem"
umount /mnt
echo "After the problem"

El problema es que el último comando desmontaje no se ejecuta, como puedo comprobar desde la salida del terminal:

# ./test5.sh 
e2fsck 1.42.12 (29-Aug-2014)
mmcblk0p1: clean, 11/117360 files, 7386/468990 blocks
STARTED
random: nonblocking pool is initialized
ENDED
647
Killed
# mount
[...]
mmcblk0p1 on /mnt type ext2 (rw,relatime,errors=continue)

En este punto, si envío manualmente el último comando en el script:

umount /mnt

la operación se realizó con éxito [lo verifiqué con mount]. ¿Por qué la última línea del guión es "invisible"? No puedo encontrar el punto que falta. ¿Cómo arreglar este problema?

Gracias de antemano a aquellos que intentarán ayudar.


editar


Estoy empezando a pensar que el comando umount / no se ejecuta debido al proceso que elimino; cuando se ejecuta manualmente:

lsof /mnt

para tener una salida detallada en lugar de fuser -m /mnt [que devuelve solo 640] la salida es:

# lsof /mnt
1   /bin/busybox    /dev/console
1   /bin/busybox    /dev/console
1   /bin/busybox    /dev/console
624 /bin/busybox    /dev/null
624 /bin/busybox    /dev/null
624 /bin/busybox    /dev/null
624 /bin/busybox    socket:[747]
624 /bin/busybox    /tmp/messages
625 /bin/busybox    /dev/null
625 /bin/busybox    /dev/null
625 /bin/busybox    /dev/null
625 /bin/busybox    socket:[751]
640 /bin/busybox    /dev/ttyAMA0
640 /bin/busybox    /dev/ttyAMA0
640 /bin/busybox    /dev/ttyAMA0
640 /bin/busybox    /dev/tty

Lo que me parece es que matar el proceso con el pid 640 [el que da el recurso ocupado, ttyAMA0 es el puerto serie de mi sistema integrado] significa la muerte del resto del script [incluso se omiten las dos líneas de eco finales ]. Y cuando ejecuto manualmente la línea de eliminación, tengo que iniciar sesión nuevamente, mientras que al iniciar el script esto no sucede. Ahora sería bueno saber el motivo y la solución.

Respuesta1

Su secuencia de comandos no desmonta el dispositivo durante la secuencia de comandos debido al hecho de que su secuencia de comandos contiene, cd ../mntlo que significa que el directorio de trabajo actual es el mismo donde se montó su dispositivo, por lo tanto, cambie su secuencia de comandos como:

#!/bin/sh

cd ../dev
e2fsck mmcblk0p1
mount -t auto mmcblk0p1 ../mnt
cd ../mnt
./../bin/test1
rm file*
variable=$(fuser -m /mnt)
echo $variable
kill -9 $variable
cd ~
sudo umount -f /mnt

información relacionada