Bash Experte gesucht: rsync und zenity script

weelkin

New member
Registriert
7 Nov. 2011
Beiträge
144
Hallo,

ich versuche gerade ein kleines Backupscript zu basteln und habe ein Problem. Hier erstmal das script:

Code:
#!/bin/bash

MOUNT="/mnt/BACKUP_BTRFS"
MOUNT_OPS="compress=lzo,subvolid=0"
DEV="/dev/sdb1"
EXCLUDE=/home/robert/ArchLinux/backup/rsync_exclude
RSYNC_OPS="-auvh --delete --progress --exclude-from=$EXCLUDE"
RSYNC_DEST="$MOUNT/BACKUP"
DATE="+%d%m%Y-%H%M"

trap "killall rsync" EXIT #Wenn die bash beendet wird, dann kille alle rsync Prozesse

# mounted backup platte falls noch nicht geschehen
function mount_backup {
        if [ -z "$(mount | grep $DEV)" ]
        then
                mount -o $MOUNT_OPS $DEV $MOUNT
        fi
}

# erstellt ein btrfs snapshot von dem backup subvolume
function snapshot {
        btrfs subvolume snapshot $MOUNT/BACKUP $MOUNT/BACKUP-$(date $DATE)
}


zenity --question --text="Start backup now?" 2>/dev/null

if [ $? -eq 0 ]
        then
        mount_backup
        if [ $? -eq 0 ] #Falls mounten erfolgreich dann wird rsync restartet
                then
                rsync $RSYNC_OPS / $RSYNC_DEST | zenity --progress --pulsate --auto-kill # Das zeigt mir einen pulsierenden Statusbalken an ink. einem "Abbrechen" Button
        fi
        if [ ${PIPESTATUS[0]} -eq 0 ] #Wenn rsync mit Fehlercode "0" beendet ist, dann erstelle einen Snapshot vom Backup
                then
                snapshot
        else
                zenity --error --text="Fehler" 2>/dev/null 
        fi
        umount $DEV # Backup platte wieder unmounten
fi

So, und nun zum eigentlichen Problem:

die Zeile
Code:
 rsync $RSYNC_OPS / $RSYNC_DEST | zenity --progress --pulsate --auto-kill
sorgt dafür, dass wenn ich den Abbrechen Button drücke, die bash beendet wird und das führt wiederrum dazu, dass die Zeile
Code:
 trap "killall rsync" EXIT
ausgeführt wird. Leider passiert das nicht, sonder die trap Anweisung wird erst ausgeführt nachdem ich den rsync Prozess manuell beende. Mein Ziel ist es aber eigentlich, dass rsync selber beendet wird sobald ich den Abrechen Button drücke.

Jemand ne Idee?


Gruß,

weelkin
 
Zenity scheint verbuggt zu sein.

Wenn du --auto-kill rausnimmst sollte es funktionieren wenn du abbrechen drückst.

Schau dir mal "yad" an .. istn ZenityFork und gefaellt mir persoenlich nochn schlag besser.

Zudem würd ich killall -9 machen .. gibt dem Process derber aufm Kopf als nur killall .. -9 killt fast immer 100%.

Grüße

alternativ:

Code:
#!/bin/bash

MOUNT="/mnt/BACKUP_BTRFS"
MOUNT_OPS="compress=lzo,subvolid=0"
DEV="/dev/sdb1"
EXCLUDE=/home/robert/ArchLinux/backup/rsync_exclude
RSYNC_OPS="-auvh --delete --progress --exclude-from=$EXCLUDE"
RSYNC_DEST="$MOUNT/BACKUP"
DATE="+%d%m%Y-%H%M"

#trap "killall rsync" EXIT #Wenn die bash beendet wird, dann kille alle rsync Prozesse

# mounted backup platte falls noch nicht geschehen
function mount_backup {
        if [ -z "$(mount | grep $DEV)" ]
        then
                mount -o $MOUNT_OPS $DEV $MOUNT
        fi
}

# erstellt ein btrfs snapshot von dem backup subvolume
function snapshot {
        btrfs subvolume snapshot $MOUNT/BACKUP $MOUNT/BACKUP-$(date $DATE)
}


zenity --question --text="Start backup now?" 2>/dev/null

if [ $? -eq 0 ]
        then
        mount_backup
        if [ $? -eq 0 ] #Falls mounten erfolgreich dann wird rsync restartet
                then
                rsync $RSYNC_OPS / $RSYNC_DEST | zenity --progress --pulsate  # Das zeigt mir einen pulsierenden Statusbalken an ink. einem "Abbrechen" Button
                if [ $? == 1 ] then;
                   killall -9 rsync
                fi

        fi
        if [ ${PIPESTATUS[0]} -eq 0 ] #Wenn rsync mit Fehlercode "0" beendet ist, dann erstelle einen Snapshot vom Backup
                then
                snapshot
        else
                zenity --error --text="Fehler" 2>/dev/null 
        fi
        umount $DEV # Backup platte wieder unmounten
fi
 
Zuletzt bearbeitet:
Oo

Wenn er Abbrechen drückt!! <- darauf bezogen! Rechnet er damit das das Backup unvollständig ist! Sonst würde er ja nicht abbrechen drücken. :facepalm::facepalm:

Warum sollte er sonst nen killall innen Backupscript bauen?!

Hat ja nichts wenn er Abbrechen drückt und das Dingen läuft trotzdem weiter (so wies nun ist) -.-

Erst lesen dann posten :)
 
Ich sehe das wie fishmac: man sollte rsync auch beim Abbruch zumindest die Chance geben momentan offene Dateien sauber zu schließen. Das tut kill -9 nicht.

Zum Thema: die Manpage von zenity sagt, dass --auto-kill den Vater-Prozess killt. Dies ist aber keineswegs das Programm vor der Pipe sondern eine (temporäre) Shell die sowohl rsync als auch zenity als Kinder hat.
 
Najo .. seh ich anders .. das öffnen der Dateien ist unproblematisch!

Das Backup ist eh hinfällig wenn du abbrechen drückst.

Aber nun gut .. das ist einfach ne Meinung :) Ich aktzeptiere deine :)

@ TE Entscheid du wie du es handlest ;)

Und halt .. wie oben auch geschrieben .. das auto-kill könnts halt sein .. die funktion ist inzwischen anders inplementiert als "früher" noch.

Grüße
 
Ich sehe das wie fishmac: man sollte rsync auch beim Abbruch zumindest die Chance geben momentan offene Dateien sauber zu schließen. Das tut kill -9 nicht.

Zum Thema: die Manpage von zenity sagt, dass --auto-kill den Vater-Prozess killt. Dies ist aber keineswegs das Programm vor der Pipe sondern eine (temporäre) Shell die sowohl rsync als auch zenity als Kinder hat.

Also sobald ich "Abbrechen" drücke ist das derzeitige Backup für mich auch inkonsistent, deswegen wäre ein "kill -9" schon ok. Was ich allerdings überhaupt nicht verstehe ist "--auto-kill". Mir ist klar, dass es nicht den Prozess vor der pipe killt ,sondern die shell aus der es gestartet wurde. WIe ich in meinem ersten Post geschrieben habe, habe ich dafür eine "trap" bentutzt. Das funktioniert aber nicht so wie ich es erwarte , sehe erster Post.

Es wäre aber auch cool zu wissen wie man "--auto-kill" richtig einsetzt.

@blafoo:

Leider funktioniert dein Lösungsansatz auch nicht:
Code:
                rsync $RSYNC_OPS / $RSYNC_DEST | zenity --progress --pulsate  # Das zeigt mir einen pulsierenden Statusbalken an ink. einem "Abbrechen" Button                 if [ $? == 1 ] then;                    killall -9 rsync                 fi

Deine If-Abfrage wird erst ausgewertet nachdem rsync beendet istm damit ist sie natürlich sinnfrei :/

Gruß,

weelkin
 
Zuletzt bearbeitet:
Zenity kannte ich jetzt nicht ...

Ein einfaches
Code:
rsync -avP rsync://127.0.0.1/gentoo-portage . | zenity --progress --pulsate --auto-kill
hat bei Abbruch schon mal mein Xtern geschlossem

Dann mal bei
Code:
man zenity
nachgesehen und
--auto-kill
Kill parent process if cancel button is pressed
OK PPID wird gekillt.
Dann ein Test mit einer Subshell.

Code:
(  rsync -avP rsync://127.0.0.1/gentoo-portage . | zenity --progress --pulsate --auto-kill )
läuft ...
 
  • ok1.de
  • ok2.de
  • thinkstore24.de
  • Preiswerte-IT - Gebrauchte Lenovo Notebooks kaufen

Werbung

Zurück
Oben