Problema ao desmontar uma imagem de disco com um script... mas não manualmente!

Problema ao desmontar uma imagem de disco com um script... mas não manualmente!

É minha primeira experiência escrevendo scripts shell e algo curioso está acontecendo. Estou trabalhando em um sistema embarcado e queria que meu script test5.sh fosse colocado na pasta /root do sistema convidado para montar a primeira partição de uma imagem de cartão eMMC, realizar um teste nela, remover os arquivos criados por test1, mato o processo que ainda está acessando o cartão [para evitar a ocupação de recursos, no meu caso há sempre apenas um único processo do comando do fusor] e finalmente quero desmontar o próprio cartão. Isto é o que eu escrevi:

#!/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"

O problema é que o último comando umount não é executado, como posso verificar na saída do 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)

Neste ponto, se eu enviar manualmente o último comando do script:

umount /mnt

a operação foi realizada com sucesso [verifiquei com mount]. Por que a última linha do script está “invisível”? Não consigo encontrar o ponto que falta. Como consertar este problema?

Desde já agradeço a quem tentar ajudar


editar


Estou começando a pensar que o comando umount /não é executado por causa do processo que mato; ao executar manualmente:

lsof /mnt

para ter uma saída detalhada em vez de fuser -m /mnt [que retorna apenas 640], a saída é:

# 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

O que me parece é que matar o processo com pid 640 [aquele que dá o recurso ocupado, ttyAMA0 é a porta serial do meu sistema embarcado] significa a morte do resto do script [até mesmo as duas linhas de eco finais são ignoradas ]. E ao executar manualmente a kill line eu tenho que fazer o login novamente, enquanto ao iniciar o script isso não acontece. Agora seria bom saber o motivo e a solução

Responder1

Seu script não desmonta o dispositivo durante o script devido ao fato de que seu script contém, cd ../mnto que significa que o diretório de trabalho atual é o mesmo onde seu dispositivo foi montado, portanto, altere seu script 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

informação relacionada