Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
gugus
- Beiträge: 385
- Registriert: 04.09.2002 17:41:17
- Wohnort: da wo ich zu Hause bin
Beitrag
von gugus » 28.11.2016 22:49:59
Hallo Gemeinde
Ich möchte sicherstellen dass eine USB Platte gemountet ist bevor ich weitere Aktionen auslöse drum habe ich in einem Bash Script folgendes:
Code: Alles auswählen
UDEV_DEV="/dev/usb-backup"
UDEV_MOUNT="/media/usb-backup"
PROC_MNT="/proc/mounts"
# USB Device von udev erstellt und kann gemountet werden"
if [ -L $UDEV_DEV ]
then
/bin/mount $UDEV_DEV $UDEV_MOUNT
else
logger "ERROR UDEV failed"
exit
fi
if [ grep -q $UDEV_MOUNT $PROC_MNT ]
then
logger "Drive Succesfully Mounted"
rsnapshot daily
else
logger "ERROR: Drive Not Mounted"
exit
fi
Leider funktioniert die 2. Abfrage nicht, grep gibt doch wahr zurück im Falle eines Treffers, oder nicht ?
Anders gefragt, wenn grep eine 0 zurück gibt im Falle eines Treffers müsste dann die Abfrage nicht mit -eg 0 erweitert werden.
Gruss
gugus
Zuletzt geändert von
gugus am 04.12.2016 18:12:56, insgesamt 3-mal geändert.
-
smutbert
- Beiträge: 8342
- Registriert: 24.07.2011 13:27:39
- Wohnort: Graz
Beitrag
von smutbert » 28.11.2016 22:57:51
Tu die eckigen Klammern weg. [ ist eine Abkürzung für test, du willst ja aber nicht den Status von test abragen sondern eben von grep
-
gugus
- Beiträge: 385
- Registriert: 04.09.2002 17:41:17
- Wohnort: da wo ich zu Hause bin
Beitrag
von gugus » 28.11.2016 23:09:03
jo, danke.
Blind vor lauter Eifer
-
gugus
- Beiträge: 385
- Registriert: 04.09.2002 17:41:17
- Wohnort: da wo ich zu Hause bin
Beitrag
von gugus » 02.12.2016 09:12:32
Hallo zusammen
Ich habe mir gedacht dass ich das Script etwas erweitere und mir noch Informationen über den Disk Verbrauch in eine Datei schreibe und diese am Ende anzeige bzw. mit Mail schicke.
Dazu habe ich eine temp Datei eingefügt und diese dann vor den snapshot und nach dem snapshot beschreibe.
Code: Alles auswählen
DISK_INFO="/tmp/disk.txt"
/bin/mount $UDEV_DEV $UDEV_MOUNT
/bin/df -h | grep $UDEV_DEV > $DISK_INFO
...snapshot
echo -e "\nDisk usage after Backup:\n" >> $DISK_INFO
/bin/df -h | grep $UDEV_DEV >> $DISK_INFO
....
Die Datei ist bis auf "Disk usage after Backup" leer, sprich der df ... wird nicht hineingeschrieben.
Kann mir bitte jemand auf die Sprünge helfen
Das ganze ist noch etwas holprig funktioniert aber bestens, soweit
gruss
gugus
-
MSfree
- Beiträge: 11605
- Registriert: 25.09.2007 19:59:30
Beitrag
von MSfree » 02.12.2016 09:20:05
gugus hat geschrieben:Code: Alles auswählen
DISK_INFO="/tmp/disk.txt"
/bin/mount $UDEV_DEV $UDEV_MOUNT
/bin/df -h | grep $UDEV_DEV > $DISK_INFO
...snapshot
echo -e "\nDisk usage after Backup:\n" >> $DISK_INFO
/bin/df -h | grep $UDEV_DEV >> $DISK_INFO
....
Die Datei ist bis auf "Disk usage after Backup" leer, sprich der df ... wird nicht hineingeschrieben.
Du könntest zu Debugzwecken noch
zwischen echo und df einfügen.
und/oder das grep erstmal weglassen:
Ist nach deinem snapshot das Gerät überhaupt noch gemountet? Die beiden Debugmöglichkeiten sollten darüber Auskunft geben können.
-
gugus
- Beiträge: 385
- Registriert: 04.09.2002 17:41:17
- Wohnort: da wo ich zu Hause bin
Beitrag
von gugus » 02.12.2016 09:39:42
Jepp, danke
Das ohne den grep funktioniert ....
Habe gerade gesehen dass er gar nicht den erwarteten Wert von UDEV_DEV="/dev/usb-backup" anzeigt sondern "/dev/sda1".
Sprich, der df liefert gar nicht den generierten Link von UDEV sondern das physische Laufwerk.
Genau das wollte ich verhindern im Fall das USB LW einmal irgendwo anders eingehängt wird.
Hmm.
Nachtrag
Klar, ich habe angenommen dass wenn ich den UDEV Link mit ls angezeigt bekomme dieser auch mit df angezeigt wird. Dem ist nicht so.
Muss mal schauen ob das überhaupt geht.
Danke
gruss
gugus
-
MSfree
- Beiträge: 11605
- Registriert: 25.09.2007 19:59:30
Beitrag
von MSfree » 02.12.2016 10:16:28
gugus hat geschrieben:
Sprich, der df liefert gar nicht den generierten Link von UDEV sondern das physische Laufwerk.
Es ist eben nur ein Link. Dienstprogramme wie df stützen sich auf die Datei /etc/mtab oder /proc/mounts und die enthalten nunmal die physikalischen Gerätenamen und nicht die Links, die auf Gerätenamen zeigen. Daran ist aber eigentlich nichts auszusetzen.
Genau das wollte ich verhindern im Fall das USB LW einmal irgendwo anders eingehängt wird.
Bitte nicht Gerätedatei (/dev/...) und Einhängpunkt (/media/...) verwechseln.
Wie sieht denn deine UDEV-Regel aus?
-
gugus
- Beiträge: 385
- Registriert: 04.09.2002 17:41:17
- Wohnort: da wo ich zu Hause bin
Beitrag
von gugus » 02.12.2016 13:22:46
Ne, schon klar.
Die UDEV Regel erstellt den /dev/usb-backup der mit /dev/sda? (wo es auch immer angehängt wird) verlinkt ist. Funktioniert.
Ich habe gerade noch etwas mit /dev/proc/mounts und grep und awk rumgespielt:
Code: Alles auswählen
cat /proc/mounts | grep /media/usb-backup | awk '{print $1}'
liefert mir (auf der Konsole) das Gerät (/dev/sda1) das ich dann für df verwenden kann.
Nur habe ich noch nicht rausgefunden wie dies im script verbaut wird:
Code: Alles auswählen
UDEV_DEV="/dev/usb-backup"
UDEV_MOUNT="/media/usb-backup"
UDEV_DEV_DEV=""
logger "USB Device UDEV_DEV existiert, vor dem mount"
/bin/mount $UDEV_DEV $UDEV_MOUNT
# Device ist eingehängt
UDEV_DEV_DEV=$(cat /proc/mounts | grep $UDEV_MOUNT | awk '{print $1}')
logger "Device ... $UDEV_DEV_DEV"
liefert noch nichts.
-
MSfree
- Beiträge: 11605
- Registriert: 25.09.2007 19:59:30
Beitrag
von MSfree » 02.12.2016 14:17:29
Warum suchst du mit deinem obigen Skript nicht einfach nach UDEV_MOUNT statt UDEV_DEV?
Warum einfach, wenn es auch kompliziert geht?
-
gugus
- Beiträge: 385
- Registriert: 04.09.2002 17:41:17
- Wohnort: da wo ich zu Hause bin
Beitrag
von gugus » 02.12.2016 15:26:25
ja, warum eigentlich nicht ?
... und schon funktioniert es.
War irgendwie auf das Device fixiert.
Verbindlichen Dank
Gruss
gugus
PS: das kommt davon wenn man nur alle paar Monate etwas scriptet, Debian läuft ja super, nichts zu tun ...
-
gugus
- Beiträge: 385
- Registriert: 04.09.2002 17:41:17
- Wohnort: da wo ich zu Hause bin
Beitrag
von gugus » 04.12.2016 11:25:18
Hallo zusammen
Ich muss nochmal nachfragen da ich keine Erklärung für das Verhalten von grep finde
Mein Script habe ich etwas erweitert und für den wiederkehrenden Teil der Abfrage (
vor und
nach dem Backup) eine Funktion erstellt.
Diese macht was es soll ausser dass der erste grep nicht funktioniert.
Auf der Konsole klappt der grep mit Dateisystem.
Die Funktion:
Code: Alles auswählen
function disk_usage()
{
NOW=$(date "+Datum: %d-%m-%Y%nZeit: %H:%M")
echo -e "\n$NOW - Disk usage $TYPE Backup:" >> $DISK_INFO
echo "" >> $DISK_INFO
/bin/df -h | /bin/grep Dateisystem >> $DISK_INFO
/bin/df -h | /bin/grep $UDEV_MOUNT >> $DISK_INFO
}
Die Ausgabe:
Datum: 04-12-2016
Zeit: 11:02 - Disk usage before Backup:
/dev/sda1 1.8T 719G 1023G 42% /media/usb-backup
Datum: 04-12-2016
Zeit: 11:03 - Disk usage after Backup:
/dev/sda1 1.8T 719G 1023G 42% /media/usb-backup
Was fehlt ist der grep mit dem Header von df -h:
Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf
Gruss
gugus
-
MegaV0lt
- Beiträge: 173
- Registriert: 21.11.2011 11:16:07
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Beitrag
von MegaV0lt » 04.12.2016 11:41:54
Eine Lösung ohne externem grep aus einem meiner Skripte:
Code: Alles auswählen
mapfile -t < <(df -Ph "$VIDEO_DIR") # Ausgabe von df in Array (Zwei Zeilen)
echo "==> Interner Speicher (${VIDEO_DIR})" # Optional
echo -e "${MAPFILE[0]}\n${MAPFILE[1]}\n" # Ausgabe (2 Zeilen)
$VIDEO_DIR durch $UDEV_MOUNT ersetzen
In Deiner Funktion würde ich auch die Echo-Umleitungen zusammenfassen (Beispiel):
Code: Alles auswählen
{ echo "Text"
echo "noch mehr Text"
Programmausgabe
} >> "$LOG"
Zuletzt geändert von
MegaV0lt am 04.12.2016 11:56:36, insgesamt 1-mal geändert.
"Das Internet? Gibt's diesen Blödsinn immer noch?"
[Homer Simpson], Sicherheitsinspektor im Kernkraftwerk Springfield.
-
MSfree
- Beiträge: 11605
- Registriert: 25.09.2007 19:59:30
Beitrag
von MSfree » 04.12.2016 11:47:00
Wenn da nichts kommt, liegt es daran, daß die Ausgabe von
/bin/df -h kein
Dateisystem enthält.
Zum Debuggen laß einfach mal das grep weg und schaue die Ausgabe in $DISK_INFO an.
Vermutlich wird in dem Fall, wenn das Skript über udev abgearbeitet wird, die Ausgabe auf englisch kommen. Die deutschen Ausgaben sind abhängig von der Umgebungsvariable
LANG, die nur für interaktiv eingelogte Benutzer auf (in meinem Fall) "de_DE.UTF-8" steht.
-
gugus
- Beiträge: 385
- Registriert: 04.09.2002 17:41:17
- Wohnort: da wo ich zu Hause bin
Beitrag
von gugus » 04.12.2016 13:43:39
Sodele
Code: Alles auswählen
root@mimas:~# df -h >> disk.txt
root@mimas:~# cat disk.txt
Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf
/dev/root 59G 2,1G 54G 4% /
devtmpfs 459M 0 459M 0% /dev
tmpfs 463M 0 463M 0% /dev/shm
tmpfs 463M 47M 417M 11% /run
tmpfs 5,0M 4,0K 5,0M 1% /run/lock
tmpfs 463M 0 463M 0% /sys/fs/cgroup
/dev/mmcblk0p1 63M 21M 43M 34% /boot
tmpfs 463M 1,2M 462M 1% /opt/omd/sites/mimas/tmp
so schaut's aus
Und:
Code: Alles auswählen
root@mimas:~# df -h | grep Dateisystem > disk.txt
root@mimas:~# cat disk.txt
Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf
Hm.
Und:
Code: Alles auswählen
root@mimas:~# df -h | grep Dateisystem > disk.txt
root@mimas:~# df -h | grep "/dev/" >> disk.txt
root@mimas:~# cat disk.txt
Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf
/dev/root 59G 2,1G 54G 4% /
tmpfs 463M 0 463M 0% /dev/shm
/dev/mmcblk0p1 63M 21M 43M 34% /boot
Doppel Hm.
-
MegaV0lt
- Beiträge: 173
- Registriert: 21.11.2011 11:16:07
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Beitrag
von MegaV0lt » 04.12.2016 14:06:52
warum nicht so:
Code: Alles auswählen
[~] # mapfile -t < <(df -Ph "/") # Ausgabe von df in Array (Zwei Zeilen)
[~] # echo -e "${MAPFILE[0]}\n${MAPFILE[1]}\n" # Ausgabe (2 Zeilen)
Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sda1 7,3G 4,5G 2,4G 66% /
"Das Internet? Gibt's diesen Blödsinn immer noch?"
[Homer Simpson], Sicherheitsinspektor im Kernkraftwerk Springfield.
-
gugus
- Beiträge: 385
- Registriert: 04.09.2002 17:41:17
- Wohnort: da wo ich zu Hause bin
Beitrag
von gugus » 04.12.2016 14:47:21
Im Prinzip ja, aber ich habe am Ende mehrere USB Platten am Raspi und weiss nicht ob die gesuchte Backup-Platte am Ende immer an der 2. Stelle steht oder immer sda1 ist.
Deshalb suche ich ursprünglich in df nach dem von UDEV festgelegten Mountpoint mit der Angabe der Platteninformationen.
Damit es etwas schöner aussieht wollte ich den Header von df vorher einkopieren.
Aber die 1. Zeile hilft ja auch, diese beinhaltet ja den Header.
Gruss
gugus
-
gugus
- Beiträge: 385
- Registriert: 04.09.2002 17:41:17
- Wohnort: da wo ich zu Hause bin
Beitrag
von gugus » 04.12.2016 18:11:57
So, jetzt schaut's gut aus
Datum: 04-12-2016
Zeit: 17:43 - Disk usage before Backup:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 1.8T 719G 1023G 42% /media/usb-backup
Datum: 04-12-2016
Zeit: 17:45 - Disk usage after Backup:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 1.8T 719G 1023G 42% /media/usb-backup
noch ein bisschen schön machen dann passt's
Danke
Gruss
gugus
-
MegaV0lt
- Beiträge: 173
- Registriert: 21.11.2011 11:16:07
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Beitrag
von MegaV0lt » 05.12.2016 09:32:04
Wenn man df den Einhängepunkt übergibt kommt auch automatisch das richtige Laufwerk raus:
Code: Alles auswählen
[~] # df -h /mnt/usbdrive
Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sdc1 37G 17G 18G 49% /mnt/SSDSA2CT040G3
[~] # ll /mnt/usbdrive
lrwxrwxrwx 1 root root 13 Mai 31 2015 /mnt/usbdrive -> SSDSA2CT040G3
"Das Internet? Gibt's diesen Blödsinn immer noch?"
[Homer Simpson], Sicherheitsinspektor im Kernkraftwerk Springfield.
-
gugus
- Beiträge: 385
- Registriert: 04.09.2002 17:41:17
- Wohnort: da wo ich zu Hause bin
Beitrag
von gugus » 06.12.2016 07:34:01
Jepp, Genau das verwende ich, ausgehend von dem von mir vorgegebenen Mountpunkt's aus UDEV
Jetzt mache ich mich noch ans Ausrechnen wie der neu belegte Platz verteilt ist.
Habe ein par coole Tips während der bisherigen Suche gefunden.
Gruss
gugus