Fortschrittsbalken in aktualisiertb


8

Ist es möglich, dabei einen zuverlässigen Fortschrittsbalken (oder nur eine zuverlässige Information darüber, wie lange es dauern wird) zu erhalten updatedb?

Antworten:


5

Nein, es gibt keine solche Option, es sollte auch keine geben.

Wenn Sie dies messen müssen, müssen Sie zuerst wissen, wie viele Dateien auf Ihrem System vorhanden sind. Dies bedeutet, dass Sie alles zweimal durchlaufen müssen. Dies kann langsam sein

Ein offensichtliches Beispiel ist, dass das Extrahieren von Kernel-Quellcode mit file-rollerlangsamer ist als das tardirekte Ausführen , da der Dateiroller zuerst alle Dateien ausfeilen muss (andernfalls wird der Fortschrittsbalken möglicherweise falsch angezeigt) und Sie auf a warten während vor dem Extraktionsprozess tatsächlich begonnen.


Du hast vollkommen Recht. Es wäre jedoch möglich, die Zeit für den nächsten Lauf mithilfe einer „intelligenten Vermutung“ vorherzusagen. Zum Beispiel könnte man aus den vergangenen Werten einen exponentiell gewichteten gleitenden Durchschnitt berechnen, der grundsätzlich davon ausgeht, dass der nächste Lauf so lange dauert wie der Durchschnitt der letzten Läufe. Dies ist natürlich nicht genau, aber sehr billig zu berechnen, da es das Dateisystem nicht durchläuft. Da sich weder die Anzahl der Dateien noch die Last dramatisch ändern, ergeben sich sehr praktische Schätzwerte.
Marco

6

Dies ist keine effiziente Lösung, aber nicht so schlimm, als würde man alles zweimal durchlaufen.

Die Anzahl der von verarbeiteten Dateien updatedbentspricht:

updatedb -v | wc -l

oder ungefähr gleich:

find / -mount | wc -l

Wir können diese Befehle nicht verwenden, um die Nummer zu erhalten, da sie zweimal wiederholt werden würde.

Wir können jedoch die Anzahl der verwendeten Inodes verwenden, die ungefähr gleich ist:

df -i | grep '/$' | awk '{print $3}'

Mit diesem Wert können wir berechnen, wie weit wir gekommen sind, während der updatedb -vBefehl ausgeführt wird:

count=$(df -i | grep '/$' | awk '{print $3}')

sudo updatedb -v | while read
do
    printf "%3d\r" $((100 * (++i) / count))
done

Dies ist sehr ineffizient, da printffür jede Zeile in der Ausgabe von aufgerufen wird updatedb -v. Besser, wenn wir printfnur für einige der Zeilen.

count=$(df -i | grep '/$' | awk '{print $3}')

sudo updatedb -v | while read
do
    if (( ++i % (count/20) == 0 )); then
        printf "%3d\r" $((100 * i / count))
    fi
done

Interessante Idee. Aber meine df -iBerichte 0 in allen Spalten für /. Möglicherweise kann das Extrahieren der Dateizahl der aktuellen Datenbank aus locate -S(oder einem --statisticsanderen ähnlichen Schalter Ihrer locateImplementierung) auch als ungefähre Dateizahl verwendet werden.
Manatwork

Diese Lösung hat bei mir funktioniert, der prozentuale Wert schien ziemlich genau zu sein.
Kubuntuer82
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.