Проблема в размонтировании образа диска со сценарием …, но не вручную!

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

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

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

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


править


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

lsof /mnt

чтобы иметь подробный вывод вместо термофиксатора-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 [тот, который дает занятый ресурс, ttyAMA0, является последовательным портом моей встроенной системы], означает смерть остальной части сценария [даже две заключительных строки эха пропускаются]. И вручную выполняя строку уничтожения я должен войти в систему снова, в то время как при запуске сценария этого не происходит. Теперь было бы хорошо знать причину и фиксацию

0
задан 15 March 2015 в 12:36

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
0
ответ дан 5 October 2019 в 02:25

Другие вопросы по тегам:

Похожие вопросы: