एक कमांड लाइन उपयोगिता यह कल्पना करने के लिए कि फाइल कितनी तेजी से बढ़ रही है?


19

मैं चाहता हूं कि कोई विशेष फ़ाइल कितनी तेजी से बढ़ रही है।

मैं कर सकता था

watch ls -l file

और इस जानकारी को परिवर्तन की दर से घटाएं।

क्या ऐसा ही कुछ है जो समय के साथ फ़ाइल के विकास की दर को सीधे आउटपुट करेगा?

जवाबों:


23

tail -f file | pv > /dev/null

लेकिन सावधान रहें कि इसमें फ़ाइल को पढ़ना शामिल है, इसलिए यह कुछ संसाधनों की तुलना में कुछ अधिक संसाधनों का उपभोग कर सकता है जो कि केवल फ़ाइल आकार देखता है।


यह एक अच्छा काम करता है - बस किसी और को एक या दो को बचाने के लिए - आपको इसे yum install pvकरने में सक्षम होने के लिए एक Centos / Redhat प्रणाली पर आवश्यकता होगी ;-)
राल्फ बोल्टन

10

progress(Coreutils प्रगति दर्शक) या pvकिसी विशेष प्रक्रिया के एक फ़ाइल विवरणक को देख सकते हैं। तो आप कर सकते हैं:

lsof your-file

यह देखने के लिए कि कौन सी प्रक्रिया ( $pid) इसे लिख रही है और किस फाइल डिस्क्रिप्टर ( $fd), और करें:

pv -d "$pid:$fd"

या:

progress -mp "$pid"

3

मेरे पास एक छोटी सी पर्ल स्क्रिप्ट है जिसे मैंने एक फ़ंक्शन के रूप में अपने बैश वातावरण में रखा है:

fileSizeChange <file> [seconds]

नींद के सेकंड 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"
}

1

निम्नलिखित शेल फ़ंक्शन किसी फ़ाइल या निर्देशिका को मॉनिटर करता है और थ्रूपुट / राइट स्पीड का अनुमान दिखाता है। के साथ निष्पादित करें monitorio <target_file_or_directory>। यदि आपके सिस्टम में डु नहीं है, जो कि हो सकता है यदि आप एम्बेडेड सिस्टम पर io थ्रूपुट की निगरानी कर रहे हैं, तो आप इसके बजाय ls का उपयोग कर सकते हैं (कोड में टिप्पणी देखें)

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
}

उदाहरण का उपयोग करें:

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

धन्यवाद इस महान काम किया! अगर कोई दिलचस्पी रखता है तो मैंने कुछ छोटे संशोधन किए हैं। मेरा फ़ाइल स्थानांतरण धब्बेदार था इसलिए मैंने स्क्रिप्ट को बंद कर दिया जब फ़ाइल का आकार नहीं बदलता है, तो अंतराल को सेट करने के लिए एक वैकल्पिक दूसरा पैरामीटर भी जोड़ा, और अब पहली बार पाठ को प्रिंट नहीं किया है क्योंकि यह हमेशा 0: gist.github है .com / einsteinx2 / 14a0e865295cf66aa9a9bf1a8e46ee49
बेन बैरन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.