Eine versteckte Datei? (höchstwahrscheinlich ein falsches Skript)

Eine versteckte Datei? (höchstwahrscheinlich ein falsches Skript)

Ich arbeite an einem Skript, das von Udev beim Einlegen einer neuen SD-Karte in meinen Beaglebone Black unter Debian Jessie ausgeführt wird.

Als Erstes soll mein Skript das Verzeichnis erstellen /media/sdcard. Das sollte einfach sein, aber aus irgendeinem unerfindlichen Grund funktioniert es nicht ...

Hier ist das Skript, das ich geschrieben habe:

#!/bin/bash -xe
#This script creates the /media/sdcard folder in order to mount the sdcard in it
#Error codes:
# - 2 : /media/sdcard already exist but is not a directory
# - 1 : Failed to create /media/sdcard/

logger -t SDCardscripts 'Entering /root/ServolineScripts/PrepareSDCard.sh script'

if [ -d /media/sdcard ]; then
logger '/media/sdcard is already present. Deleting it.' && rm -rf /media/sdcard;
elif [ -f /media/sdcard ]; then
logger -t SDCardscripts 'A file /media/sdcard already exist! Stopping process, Please look in the /media directory and take a decision with it content'
exit 2
else
logger -t SDCardscripts '/media/sdcard does not exist creating a new one'
fi

mkdir -p /media/sdcard

if [ $? -eq 0 ];then
logger -t SDCardscripts '/media/sdcard directory successfully created';
else
logger -t SDCardscripts 'Failed to create /media/sdcard directory'
exit 1;
fi

logger -t SDCardscripts 'Leaving /root/ServolineScripts/PrepareSDCard.sh script'

Hier sind die Protokollzeilen, die generiert werden, wenn ich eine SD-Karte einstecke:

Nov 24 14:06:34 undefined kernel: [ 5546.379851] mmc0: host does not support reading read-only switch, assuming write-enable
Nov 24 14:06:34 undefined kernel: [ 5546.383558] mmc0: new high speed SDHC card at address 0007
Nov 24 14:06:34 undefined kernel: [ 5546.401181] mmcblk0: mmc0:0007 SD08G 7.42 GiB 
Nov 24 14:06:34 undefined rsyslogd-2007: action 'action 17' suspended, next retry is Fri Nov 24 14:07:04 2017 [try http://www.rsyslog.com/e/2007 ]
Nov 24 14:06:34 undefined kernel: [ 5546.413258]  mmcblk0: p1
Nov 24 14:06:34 undefined SDCardscripts: Entering /root/ServolineScripts/PrepareSDCard.sh script
Nov 24 14:06:35 undefined logger: /media/sdcard is already present. Deleting it.
Nov 24 14:06:35 undefined systemd-udevd[2003]: Process '/root/ServolineScripts/PrepareSDCard.sh' failed with exit code 1.
Nov 24 14:06:35 undefined systemd-udevd[2003]: Process '/bin/mount /dev/%K /media/sdcard' failed with exit code 32.

Was ich also verstehe ist:

  • Udev in mein Skript eingeben OK
  • Udev hat erfolgreich geprüft, ob eine Datei vorhanden ist
  • Udev kann mkdir nicht ausführen

Nachdem ich dieses Skript ausgeführt hatte, habe ich Folgendes versucht:

root@undefined:~/ServolineScripts# cd /media
root@undefined:/media# ls -l
total 0

Kein Kommentar...

Schließlich habe ich versucht, die Zeilen zu löschen, um zu prüfen, ob /media/sdcard bereits vorhanden ist (alle ersten if- und elif-Anweisungen). In diesem Fall schlägt der Vorgang bei der Ausführung von mkdir fehl.

Diese Symptome treten auf, wenn ich die µSD-Karte einstecke. Wenn ich das Skript jedoch durch Eintippen ausführe bash -xe /root/ServolineScripts/PrepareSDCard, erhalte ich Folgendes:

+ logger -t SDCardscripts 'Entering /root/ServolineScripts/PrepareSDCard.sh script'
+ '[' -d /media/sdcard ']'
+ logger '/media/sdcard is already present. Deleting it.'
+ rm -rf /media/sdcard
+ mkdir -p /media/sdcard
+ '[' 0 -eq 0 ']'
+ logger -t SDCardscripts '/media/sdcard directory successfully created'
+ logger -t SDCardscripts 'Leaving /root/ServolineScripts/PrepareSDCard.sh script'

(Und offensichtlich war die Ausführung von mkdir erfolgreich und /media/sdcard/ wurde erstellt …)

* Wenn Sie eine Idee haben, wo das Problem liegt ... oder irgendetwas, das mir bei der Fehlerbehebung helfen könnte ...*

(ich bin seit 4 Tagen daran ... ich habe sogar versucht, den Beagle mit einem neuen Image wiederherzustellen ... :-( )

PS: Ich habe bereits gesehen, dass die verschiedenen von mir geschriebenen Return-Befehle nicht die richtigen sind. Wenn Sie wissen, wie man ein Skript beim Zurückgeben eines Werts unterbricht, nehme ich das an! Aber das ist ein zweites Thema ...

Antwort1

Ihr Skript wird beendet, sobald es einen Fehler erhält, weil Sie es bash -eaktiviert haben.

Der Befehl schlägt fehl rm -rf, weil zum Zeitpunkt der Ausführung Ihres Skripts ein auf gemountetes Dateisystem vorhanden ist /media/sdcard.

Beispiel

# Prepare disk as image
dd if=/dev/zero bs=1M count=100 >100M.img
lo=$(losetup --find --show 100M.img | tee /dev/stderr)
fdisk $lo <<X
n
p
1


w
X
losetup -d $lo
lo=$(losetup --find --show --partscan 100M.img | tee /dev/stderr)

# Create and mount new filesystem
mkfs -t ext4 ${lo}p1
mkdir -p /mnt/dsk
mount ${lo}p1 /mnt/dsk

# Demonstrate trying to remove the directory tree (and failing)
rm -rf /mnt/dsk
echo SS=$?

# All done
umount /mnt/dsk
losetup -d $lo
rm 100M.img

verwandte Informationen