Problema na desmontagem de uma imagem de disco com um script… mas não manualmente!

0

É minha primeira experiência escrevendo scripts de shell e algo curioso está acontecendo. Estou trabalhando em um sistema embarcado e queria que meu script test5.sh colocado na pasta / root do sistema guest para montar a primeira partição de uma imagem do cartão eMMC, realizar um teste nele, remover os arquivos criados pelo test1, mata o processo ainda acessando o cartão [para evitar recursos ocupados, no meu caso há sempre apenas um único processo do comando do fusor] e finalmente eu 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, pois posso checar a 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 no script:

umount /mnt

a operação foi realizada com sucesso [verifiquei com o mount]. Por que a última linha do script é "invisível"? Não consigo encontrar o ponto que falta. Como corrigir esse problema?

Agradecemos antecipadamente àqueles que tentarão ajudar

editar

Estou começando a achar que o umount / command não é executado por causa do processo que mato; quando executando 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é os dois ecos finais linhas são ignoradas]. E quando manualmente executando a linha de abandono eu tenho que logar novamente enquanto ao lançar o script isso não acontece. Agora seria bom saber o motivo e a correção

    
por Antonino 15.03.2015 / 18:18

1 resposta

0

Seu script não desmonta o dispositivo durante o script devido ao fato de seu script conter   cd ../mnt , o 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
    
por Faizan Akram Dar 15.03.2015 / 18:47