Antworten:
progress
(Coreutils-Fortschrittsanzeige) oder neuere Versionen von pv
können einen Dateideskriptor eines bestimmten Prozesses anzeigen . Sie können also Folgendes tun:
lsof your-file
Um zu sehen, welcher Prozess ( $pid
) darauf schreibt und auf welchem Dateideskriptor ( $fd
), und um Folgendes zu tun:
pv -d "$pid:$fd"
oder:
progress -mp "$pid"
Ich habe ein kleines Perl-Skript, das ich als Funktion in meine Bash-Umgebung geschrieben habe:
fileSizeChange <file> [seconds]
Die Standardeinstellung für Ruhezustand ist 1.
fileSizeChange() {
perl -e '
$file = shift; die "no file [$file]" unless -f $file;
$sleep = shift; $sleep = 1 unless $sleep =~ /^[0-9]+$/;
$format = "%0.2f %0.2f\n";
while(1){
$size = ((stat($file))[7]);
$change = $size - $lastsize;
printf $format, $size/1024/1024, $change/1024/1024/$sleep;
sleep $sleep;
$lastsize = $size;
}' "$1" "$2"
}
Die folgende Shell-Funktion überwacht eine Datei oder ein Verzeichnis und zeigt eine Schätzung der Durchsatz- / Schreibgeschwindigkeit an. Ausführen mit monitorio <target_file_or_directory>
. Wenn Ihr System kein du hat, was der Fall sein kann, wenn Sie den Durchsatz auf einem eingebetteten System überwachen, können Sie stattdessen ls verwenden (siehe Kommentar im Code).
monitorio () {
# show write speed for file or directory
interval="10"
target="$1"
size=$(du -ks "$target" | awk '{print $1}')
firstrun="1"
echo ""
while [ 1 ]; do
prevsize=$size
size=$(du -ks "$target" | awk '{print $1}')
#size=$(ls -l "$1" | awk '{print $5/1024}')
kb=$((${size} - ${prevsize}))
kbmin=$((${kb}* (60/${interval}) ))
kbhour=$((${kbmin}*60))
# exit if this is not first loop & file size has not changed
if [ $firstrun -ne 1 ] && [ $kb -eq 0 ]; then break; fi
echo -e "\e[1A $target changed ${kb}KB ${kbmin}KB/min ${kbhour}KB/hour size: ${size}KB"
firstrun=0
sleep $interval
done
}
Beispiel verwenden:
user@host:~$ dd if=/dev/zero of=/tmp/zero bs=1 count=50000000 &
user@host:~$ monitorio /tmp/zero
/tmp/zero changed 4KB 24KB/min 1440KB/hour size: 4164KB
/tmp/zero changed 9168KB 55008KB/min 3300480KB/hour size: 13332KB
/tmp/zero changed 9276KB 55656KB/min 3339360KB/hour size: 22608KB
/tmp/zero changed 8856KB 53136KB/min 3188160KB/hour size: 31464KB
^C
user@host:~$ killall dd; rm /tmp/zero
yum install pv
ein Centos / Redhat-System haben, um dies zu tun ;-)