[gelöst] bash - if und grep

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
gugus
Beiträge: 376
Registriert: 04.09.2002 17:41:17
Wohnort: da wo ich zu Hause bin

[gelöst] bash - if und grep

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.

Benutzeravatar
smutbert
Moderator
Beiträge: 8317
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: bash - if und grep

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

Code: Alles auswählen

if grep -q ...

gugus
Beiträge: 376
Registriert: 04.09.2002 17:41:17
Wohnort: da wo ich zu Hause bin

Re: bash - if und grep

Beitrag von gugus » 28.11.2016 23:09:03

jo, danke.
Blind vor lauter Eifer :mrgreen:

gugus
Beiträge: 376
Registriert: 04.09.2002 17:41:17
Wohnort: da wo ich zu Hause bin

Re: bash - if und grep

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 :mrgreen:

gruss
gugus

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: bash - if und grep

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

Code: Alles auswählen

echo "Mein Backup geht auf " $UDEV_DEV >> $DISK_INFO
zwischen echo und df einfügen.
und/oder das grep erstmal weglassen:

Code: Alles auswählen

/bin/df -h >> $DISK_INFO
Ist nach deinem snapshot das Gerät überhaupt noch gemountet? Die beiden Debugmöglichkeiten sollten darüber Auskunft geben können.

gugus
Beiträge: 376
Registriert: 04.09.2002 17:41:17
Wohnort: da wo ich zu Hause bin

Re: bash - if und grep

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".

Code: Alles auswählen

/dev/sda1       1.8T  719G 1023G  42% /media/usb-backup
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

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: bash - if und grep

Beitrag von MSfree » 02.12.2016 10:16:28

gugus hat geschrieben:

Code: Alles auswählen

/dev/sda1       1.8T  719G 1023G  42% /media/usb-backup
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: 376
Registriert: 04.09.2002 17:41:17
Wohnort: da wo ich zu Hause bin

Re: bash - if und grep

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.

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: bash - if und grep

Beitrag von MSfree » 02.12.2016 14:17:29

Warum suchst du mit deinem obigen Skript nicht einfach nach UDEV_MOUNT statt UDEV_DEV?

Code: Alles auswählen

/bin/df -h | grep $UDEV_MOUNT >> $DISK_INFO
Warum einfach, wenn es auch kompliziert geht? :mrgreen:

gugus
Beiträge: 376
Registriert: 04.09.2002 17:41:17
Wohnort: da wo ich zu Hause bin

Re: bash - if und grep

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 :THX:

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: 376
Registriert: 04.09.2002 17:41:17
Wohnort: da wo ich zu Hause bin

Re: bash - if und grep

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

Benutzeravatar
MegaV0lt
Beiträge: 163
Registriert: 21.11.2011 11:16:07
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: bash - if und grep

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.

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: bash - if und grep

Beitrag von MSfree » 04.12.2016 11:47:00

gugus hat geschrieben:

Code: Alles auswählen

/bin/df -h | /bin/grep Dateisystem >> $DISK_INFO
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.

Code: Alles auswählen

/bin/df -h >> $DISK_INFO
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: 376
Registriert: 04.09.2002 17:41:17
Wohnort: da wo ich zu Hause bin

Re: bash - if und grep

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.

Benutzeravatar
MegaV0lt
Beiträge: 163
Registriert: 21.11.2011 11:16:07
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: bash - if und grep

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: 376
Registriert: 04.09.2002 17:41:17
Wohnort: da wo ich zu Hause bin

Re: bash - if und grep

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: 376
Registriert: 04.09.2002 17:41:17
Wohnort: da wo ich zu Hause bin

[gelöst] Re: bash - if und grep

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 :THX:
Danke
Gruss
gugus

Benutzeravatar
MegaV0lt
Beiträge: 163
Registriert: 21.11.2011 11:16:07
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: [gelöst] bash - if und grep

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: 376
Registriert: 04.09.2002 17:41:17
Wohnort: da wo ich zu Hause bin

Re: [gelöst] bash - if und grep

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

Antworten