Προς το περιεχόμενο

System tar & restore Project


Προτεινόμενες αναρτήσεις

Δημοσ.

Εχω ενα θεματακι.

 

Ο dialog --gauge θελει να του δινεις απο νουμερα 1-100 και τα εμφανιζει σαν ποσοστο.

 

Μετατρεποντας το output της tar σε νουμερα με:

while read ln; do b=$(( b + 1 )) && echo -e "\r$(($b*100/$total))"; done

παιρνω:

 

0

0

0

0

1

1

1

1

2

2

2

2

....

100

 

που θα πει οτι ναι μεν δουλευει το gauge, αλλα αργει πολυ.

 

δοκιμασα με uniq -d και awk  '!(saw[$0]++)' ωστε να παιρνω κανονικα:

1

2

3

4

5

....

100

 

αλλα μετα δεν μπορω να κανω σωστο pipe στον dialog (πρωτα τελειωνει το output της tar και μετα αρχιζει το gauge.)

 

Help ?  :(

 

Αν δεν μπορει να γινει κατι τοτε θα το αφησω με dialog --progress να δειχνει το ποσοστο, χωρις gauge.

Δημοσ.

Καταρχάς το b είναι ο αριθμός των αρχείων ? (ή των block του tar ?)

 

Αν το b παίρνει τιμές από το 1 έως πχ το 550 και το ανάγεις στο 100 λογικό δεν είναι να έχεις τετραπλές και πενταπλές εμφανίσεις και (φαινομενικά) να αργεί να ανανεώσει το gauge ? Με τον δεύτερο τρόπο και το uniq πως το κάνεις ?

 

Μάλλον δεν κατάλαβα κάτι καλά.

Δημοσ.

Στο b δινω μια αυξουσα τιμη για καθε νεο line του output της tar.

Ναι το ξερω οτι ειναι λογικο, το θεμα ειναι πως μπορω πετυχω αυτο:
 

run_tar 2>>"$BRFOLDER"/backup.log | while read ln; do
b=$(( b + 1 ))
echo -e "\r$(($b*100/$total))"
done | uniq -d

χωρις το uniq -d, ή το παραπανω να γινει real-time pipe στον dialog.
 
Το προβλημα μου ειναι οτι αυτο:

run_tar 2>>"$BRFOLDER"/backup.log | while read ln; do b=$(( b + 1 )) && echo -en "\rCompressing: $(($b*100/$total))%"; done

ειναι το ιδιο γρηγορο οσο η ιδια η tar/rsync, ενω αυτο:

run_tar 2>>"$BRFOLDER"/backup.log | while read ln; do b=$(( b + 1 )) && echo -e "\r$(($b*100/$total))"; done | dialog --gauge "Compressing..." 0 50

κανει πανω απο τον διπλασιο χρονο, και για αυτο υποθετω οτι φταινε οι πολλαπλες ιδιες τιμες στο ποσοστο.

Δημοσ.

Στο b δινω μια αυξουσα τιμη για καθε νεο line του output της tar.

 

Ναι το ξερω οτι ειναι λογικο, το θεμα ειναι πως μπορω πετυχω αυτο:

 

run_tar 2>>"$BRFOLDER"/backup.log | while read ln; do
b=$(( b + 1 ))
echo -e "\r$(($b*100/$total))"
done | uniq -d
χωρις το uniq -d, ή το παραπανω να γινει real-time pipe στον dialog.

 

Το προβλημα μου ειναι οτι αυτο:

run_tar 2>>"$BRFOLDER"/backup.log | while read ln; do b=$(( b + 1 )) && echo -en "\rCompressing: $(($b*100/$total))%"; done
ειναι το ιδιο γρηγορο οσο η ιδια η tar/rsync, ενω αυτο:

run_tar 2>>"$BRFOLDER"/backup.log | while read ln; do b=$(( b + 1 )) && echo -e "\r$(($b*100/$total))"; done | dialog --gauge "Compressing..." 0 50

κανει πανω απο τον διπλασιο χρονο, και για αυτο υποθετω οτι φταινε οι πολλαπλες ιδιες τιμες στο ποσοστο.

 

Τρέχοντας τα σε μένα παίρνω και στις δύο περιπτώσεις ίδιο χρόνο (12sec). Αν δεν έχεις κάποιο sleep μετά από κάθε τιμή δεν μπορώ να καταλάβω γιατί να θέλει διπλό χρόνο η dialog. Γιατί δεν βάζεις μπακάλικα μια 2η μεταβλητή ώστε να δεις αν φταίνε οι πολλαπλές τιμές ? Αν το b αφού έχει αυξηθεί είναι ίδιο με το lastb να μην τρέχει τίποτα αλλιώς να τρέχει lastb=b και μετά το echo.

 

Edit: Επειδή ο χρόνος ήταν πολύ μικρός και ίσως να μην φαίνεται η διαφορά, δοκίμασα ένα μεγαλύτερο κατάλογο και πάλι πήρα ίδιο αποτέλεσμα (3 λεπτά και 9 δευτερόλεπτα). Δοκίμασα και σκέτο tar μήπως ο φόρτος που βάζει στον επεξεργαστή η gzip φέρνει πιο κοντά τα δύο αποτελέσματα και δεν αφήνει να φανεί η διαφορά και πάλι πήρα ίδιο αποτέλεσμα.

Δημοσ.

Δεν μπορω να καταλαβω...πχ για τον /etc μονο:
 

tar cvf /dev/null  /etc 2> /dev/null | while read ln; do a=$(( a + 1 )) && echo -en "\rCalculating: $a Files"; done

για να δω ποσα αρχεια θα μπουν στο archive, οποτε total=1029 αρχεια
 

time tar cvpzf etc.tar.gz /etc 2> /dev/null | while read ln; do b=$(( b + 1 )) && echo -en "\rCompressing: $(($b*100/1029))%"; done

Compressing: 100%
real 0m1.876s
user 0m1.400s
sys 0m0.140s

 

Ωραια και καλα. Αλλα:

time tar cvpzf etc.tar.gz /etc 2> /dev/null | while read ln; do b=$(( b + 1 )) && echo -e "\r$(($b*100/1029))"; done | dialog --gauge "Compressing..." 0 50

real 0m11.744s
user 0m1.840s
sys 0m0.320s

 

Δεν εχω μεσα καπου sleep... :-(

 

imitheos, μπορεις να δωσεις ενα παραδειγμα με το statement που ειπες με το lastb?

Δημοσ.

Δεν μπορω να καταλαβω...πχ για τον /etc μονο:

 

tar cvf /dev/null  /etc 2> /dev/null | while read ln; do a=$(( a + 1 )) && echo -en "\rCalculating: $a Files"; done
για να δω ποσα αρχεια θα μπουν στο archive, οποτε total=1029 αρχεια

 

time tar cvpzf etc.tar.gz /etc 2> /dev/null | while read ln; do b=$(( b + 1 )) && echo -en "\rCompressing: $(($b*100/1029))%"; done
Compressing: 100%

real 0m1.876s

user 0m1.400s

sys 0m0.140s

 

Ωραια και καλα. Αλλα:

time tar cvpzf etc.tar.gz /etc 2> /dev/null | while read ln; do b=$(( b + 1 )) && echo -e "\r$(($b*100/1029))"; done | dialog --gauge "Compressing..." 0 50
real 0m11.744s

user 0m1.840s

sys 0m0.320s

 

Δεν εχω μεσα καπου sleep... :-(

 

imitheos, μπορεις να δωσεις ενα παραδειγμα με το statement που ειπες με το lastb?

 

Δίκιο έχεις. Τελικά πρέπει να παίζει κάτι με το sleep που είπα αλλά όχι όπως το είπα. Ίσως η dialog για να εμφανίζει πιο ομαλά τα αποτελέσματα εισάγει μια μικρή καθυστέρηση μετά από κάθε εμφάνιση. Όταν έχεις μεγάλο αριθμό αρχείων έχεις μεγάλη καθυστέρηση. Το παράξενο είναι πως όταν τρέχω τις εντολές σε ένα κατάλογο με 601 αρχεία παίρνω ολόιδια αποτελέσματα (το gauge μάλιστα είναι πιο γρήγορο) ενώ στο /etc που έχω 1621 αρχεία παίρνω καθυστέρηση όπως και εσύ (5.8s με 16s). Δοκίμασα το ίδιο σε ένα maildir με 17552 πολύ μικρά αρχεία και ενώ το απλό θέλει 2.2s, η dialog χρειάζεται 178s :) Αλλάζοντας τον κώδικα ώστε να χρησιμοποιεί μια ενδιάμεση μεταβλητή και να τυπώνει μόνο 100 τιμές φέρνει τον χρόνο σε 2.0s

 

b=0
lastper=0
time tar cvpzf etc.tar.gz /etc 2> /dev/null | while read ln; do
  b=$(( b + 1 ))
  per=$((b*100/$total))
  if [ $per -gt $lastper ]; then
    lastper=per
    echo -e "\r$(($b*100/1029))"
  fi
done | dialog --gauge "Compressing..." 0 50
Δημοσ.

imithee ευχαριστω πολυ!

tar cvpzf etc.tar.gz /etc 2> /dev/null | while read ln; do

b=$(( b + 1 ))
per=$(($b*100/1029))

if [[ $per -gt $lastper ]]; then
  lastper=$per
  echo $lastper
fi

done | dialog --gauge "Compressing..." 0 50

Τρεχει νερακι!

 

:-D

Δημοσ.

Ωραιο το man page martinoff, εκανα λιγες αλλαγες και το ανεβασα στο git.

 

Θα μπει στην 3.2.

 

Λογικα το κανω .gz και το πεταω στο /usr/share/man/man1/ ε ?

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...