Проблема с размонтированием образа диска с помощью скрипта... но не вручную!

Проблема с размонтированием образа диска с помощью скрипта... но не вручную!

Это мой первый опыт написания скриптов оболочки, и происходит что-то любопытное. Я работаю над встроенной системой и хочу, чтобы мой скрипт test5.sh, размещенный в папке /root гостевой системы, монтировал первый раздел образа карты eMMC, выполнял на нем тест, удалял файлы, созданные test1, убивал процесс, все еще обращающийся к карте [чтобы избежать перегрузки ресурсов, в моем случае всегда есть только один процесс из команды fuser] и, наконец, я хочу размонтировать саму карту. Вот что я написал:

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

Проблема в том, что последняя команда umount не выполняется, что я могу проверить по выводу терминала:

# ./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)

Если на этом этапе я вручную отправлю последнюю команду в скрипте:

umount /mnt

операция успешно выполнена [я проверил с помощью mount]. Почему последняя строка скрипта "невидима"? Я не могу найти пропущенную точку. Как исправить эту проблему?

Заранее спасибо тем, кто попытается помочь.


редактировать


Я начинаю думать, что команда umount /command не выполняется из-за процесса, который я убиваю; при ручном запуске:

lsof /mnt

чтобы получить подробный вывод вместо fuser -m /mnt [который возвращает только 640], вывод будет следующим:

# 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

Мне кажется, что убийство процесса с pid 640 [тот, который дает ресурс busy, ttyAMA0 — это последовательный порт моей встроенной системы] означает смерть остальной части скрипта [даже две последние строки echo пропускаются]. И при ручном выполнении строки kill мне приходится снова входить в систему, а при запуске скрипта этого не происходит. Теперь было бы неплохо узнать причину и исправление

решение1

Ваш скрипт не размонтирует устройство во время работы, поскольку он содержит , cd ../mntчто означает, что текущий рабочий каталог тот же, куда было смонтировано ваше устройство, поэтому измените свой скрипт следующим образом:

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

Связанный контент