Problem beim Unmounten eines Disk-Images mit einem Skript … aber nicht manuell!

Problem beim Unmounten eines Disk-Images mit einem Skript … aber nicht manuell!

Dies ist meine erste Erfahrung mit dem Schreiben von Shell-Skripten und es passiert etwas Merkwürdiges. Ich arbeite an einem eingebetteten System und wollte mein Skript test5.sh im /root-Ordner des Gastsystems platzieren, um die erste Partition eines eMMC-Kartenabbilds zu mounten, einen Test darauf durchzuführen, die von test1 erstellten Dateien zu entfernen, den Prozess zu beenden, der noch auf die Karte zugreift [um Ressourcenbelegung zu vermeiden, in meinem Fall gibt es immer nur einen einzigen Prozess vom Fuser-Befehl] und schließlich möchte ich die Karte selbst unmounten. Das habe ich geschrieben:

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

Das Problem besteht darin, dass der letzte umount-Befehl nicht ausgeführt wird, wie ich anhand der Terminalausgabe überprüfen kann:

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

Wenn ich an dieser Stelle den letzten Befehl im Skript manuell sende:

umount /mnt

der Vorgang wurde erfolgreich ausgeführt [ich habe es mit mount überprüft]. Warum ist die letzte Zeile des Skripts „unsichtbar“? Ich kann den fehlenden Punkt nicht finden. Wie kann ich dieses Problem beheben?

Vielen Dank im Voraus an alle, die versuchen zu helfen


bearbeiten


Ich fange an zu glauben, dass der Befehl umount / nicht ausgeführt wird, weil ich den Prozess beende. Beim manuellen Ausführen von:

lsof /mnt

um eine ausführliche Ausgabe zu erhalten, lautet die Ausgabe anstelle von fuser -m /mnt [das nur 640 zurückgibt]:

# 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

Mir scheint, dass das Beenden des Prozesses mit PID 640 [derjenige, der die Ressource „busy“ gibt, ttyAMA0 ist der serielle Port meines eingebetteten Systems] den Tod des restlichen Skripts bedeutet [sogar die beiden letzten Echozeilen werden übersprungen]. Und wenn ich die Kill-Zeile manuell ausführe, muss ich mich erneut anmelden, während dies beim Starten des Skripts nicht geschieht. Jetzt wäre es schön, den Grund und die Lösung zu kennen

Antwort1

Ihr Skript hängt das Gerät während des Skripts nicht aus, da Ihr Skript cd ../mntFolgendes enthält: Das aktuelle Arbeitsverzeichnis ist dasselbe, in dem Ihr Gerät eingebunden wurde. Ändern Sie daher Ihr Skript wie folgt:

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

verwandte Informationen