क्या लिनक्स में डीडी पर प्रतिशत प्राप्त करने की एक विधि है?


43

तो यहाँ क्या हो रहा है।

मैंने अपने सर्वर पर लिनक्स लाइव यूएसबी के माध्यम से एक ड्राइव का बैकअप शुरू किया। मैंने ddकमांड वेनिला के साथ पहली ड्राइव की प्रतिलिपि बनाना शुरू किया ; बस sudo dd if=/dev/sda of=/dev/sdc1और फिर मुझे याद आया कि यह बस कंसोल को खाली छोड़ देता है जब तक कि यह खत्म नहीं हो जाता।

मुझे वैसे भी एक ही ड्राइव पर एक अलग बैकअप चलाने की आवश्यकता थी, इसलिए मैंने उस एक के साथ-साथ शुरुआत की sudo dd if=/dev/sdb of=/dev/sdc3 status=progressऔर फिर मुझे एक पाठ की पंक्ति मिली जो हस्तांतरण की वर्तमान दर और बाइट्स में प्रगति को दर्शाती है।

मैं एक विधि की उम्मीद कर रहा था जो 1.8TBs में से कितने बाइट्स का बैकअप देती है, गणित करने के बजाय बैकअप का एक प्रतिशत दिखाता है। क्या स्थिति = प्रगति की तुलना में ऐसा करने का एक आसान तरीका है?

जवाबों:


69

इस प्रश्न के उत्तर देखें [ 1 ]

pv

उदाहरण के लिए आप शुरू करने से पहले उपयोग कर सकते हैंpv

sudo apt-get install pv    # if you do not have it
pv < /dev/sda > /dev/sc3   # it is reported to be faster
pv /dev/sda > /dev/sc3     # it seems to have the same speed of the previous one
#or 
sudo dd if=/dev/sda | pv -s 1844G | dd of=/dev/sdc3  # Maybe slower 

आउटपुट [ 2 ] :

440MB 0:00:38 [11.6MB/s] [======>                             ] 21% ETA 0:02:19

नोट:
विशेष रूप से बड़ी फ़ाइलों के लिए आप man ddअपने हार्डवेयर को तेज करने के लिए आवश्यक विकल्पों को देखना और सेट करना चाहते हैं , उदाहरण के bs=100Mलिए, बफर को सेट करने के लिए, oflag=syncलिखे गए प्रभावी बाइट्स की गणना करने के लिए, शायद direct...
विकल्प -sकेवल पूर्णांक पैरामीटर लेता है 1.8T-->1844G
जैसा कि आप पहली पंक्तियों से देख सकते हैं कि आपको इसकी बिल्कुल भी आवश्यकता नहीं है dd


kill -USR1 pid

यदि आप पहले से ही शुरू कीdd , आदेश एक बार आप अपने पीआईडी individuated है ( Ctrl- Z+ bgऔर आप इसे पढ़ें, या pgrep ^dd...) यदि आप एक संकेत भेज सकते हैं USR1(या SIGUSR1, या SIGINFOनीचे देखें) और आउटपुट पढ़ें।
यदि कार्यक्रम का पीआईडी ​​1234 है

kill -USR1 1234

dd अपने STDERR के टर्मिनल पर कुछ इसी तरह का उत्तर देगा

4+1 records in
4+0 records out
41943040 bytes (42 MB) copied, 2.90588 s, 14.4 MB/s

चेतावनी: OpenBSD के तहत आपको पहले से kill[ 3 ] के व्यवहार की जांच करनी पड़ सकती है : इसके बजाय उपयोग करें
kill -SIGINFO 1234
इसमें मौजूद सिगनेशन नाम दिया गया है SIGINFOSIGUSR1एक, इस मामले में, चाहिए समाप्त कार्यक्रम ( dd) ...
Ubuntu का उपयोग के तहत -SIGUSR1( 10)।


9
आप लगभग निश्चित रूप से पाएंगे कि dd कमांड पर 'bs' का प्रयोग बेहद तेजी से होता है। जैसे dd if = / dev / blah of = / tmp / blah bs = 100M एक समय में 100M ब्लॉक ट्रांसफर करने के लिए
Sirex

1
@ निश्चित रूप से आपको अपने हार्डवेयर के संबंध में स्थानांतरण दर का अनुकूलन करने के लिए bs सेट करना होगा ... उत्तर में केवल ओपी की कमांडलाइन दोहराई गई है। :-)
हस्त्तूर

3
@Criggie: कि शायद वजह से ddपहले से ही सब समाप्त किया था write()प्रणाली कॉल, और fsyncया closeडिस्क तक पहुँचने के लिए लेखन के लिए इंतज़ार कर ब्लॉक किया गया था। एक धीमी यूएसबी स्टिक के साथ, डिफॉल्ट लिनक्स I / O बफर थ्रेसहोल्ड के लिए कि कैसे बड़े गंदे लेखन-बफ़र्स को तेज डिस्क पर बड़ी फ़ाइलों की तुलना में गुणात्मक रूप से भिन्न व्यवहार की ओर ले जाया जा सकता है, क्योंकि बफ़र्स जितने बड़े होते हैं उतने ही बड़े होते हैं, जो आप कॉपी कर रहे हैं और यह अभी भी ध्यान देने योग्य समय लगता है।
पीटर कॉर्ड्स

5
बहुत बढ़िया जवाब। हालांकि, मैं यह नोट करना चाहता हूं कि OpenBSD में सही किल सिग्नल SIGINFO है, SIGUSR1 नहीं। OpenBSD में -USR1 का उपयोग करना dd को मार देगा। तो इससे पहले कि आप एक नए वातावरण में इसे आज़माएं, एक हस्तांतरण पर जिसे आप बाधित नहीं करना चाहते हैं, आप अपने आप को परिचित करना चाह सकते हैं कि पर्यावरण कैसे काम करता है (सुरक्षित परीक्षण पर)।
TOOGAM

1
संकेतों के लिए सलाह ddवास्तव में बहुत अच्छी जानकारी है, विशेष रूप से उन सर्वरों के लिए जहां आप स्थापित नहीं कर सकते हैंpv
माइक

38

इस तरह के सामान के लिए मेरा गो टू टूल है progress:

इस टूल को टिनी , डर्टी, लिनक्स और OSX- ओनली C कमांड के रूप में वर्णित किया जा सकता है , जो आपके सिस्टम में वर्तमान में चल रहे कोरुटिल्स बेसिक कमांड (cp, mv, dd, tar, gzip / gunzip, cat, आदि) के लिए दिखता है। कॉपी किए गए डेटा का प्रतिशत प्रदर्शित करता है । यह अनुमानित समय और थ्रूपुट भी दिखा सकता है , और एक "टॉप-लाइक" मोड (निगरानी) प्रदान करता है।

"<कोड> प्रगति </ कोड> कार्रवाई में" स्क्रीनशॉट

यह केवल /procदिलचस्प कमांड के लिए स्कैन करता है , और फिर निर्देशिकाओं को देखता है fdऔर fdinfoखोली गई फ़ाइलों को ढूंढता है और पदों की तलाश करता है, और सबसे बड़ी फ़ाइल के लिए स्थिति की रिपोर्ट करता है।

यह बहुत हल्का है, और वस्तुतः किसी भी आदेश के साथ संगत है।

मुझे यह विशेष रूप से उपयोगी लगता है क्योंकि:

  • pvपाइप की तुलना में या dcfldd, मुझे ऑपरेशन शुरू करने पर एक अलग कमांड चलाने के लिए याद रखने की ज़रूरत नहीं है, मैं इस तथ्य के बाद सामान की निगरानी कर सकता हूं;
  • की तुलना में kill -USR1, यह लगभग किसी भी कमांड पर काम करता है, मुझे यह सुनिश्चित करने के लिए हमेशा मैनपेज को डबल-चेक नहीं करना पड़ता है कि मैं गलती से कॉपी नहीं मार रहा हूं; इसके अलावा, यह अच्छा है कि, जब मापदंडों के बिना आह्वान किया जाता है, तो यह वर्तमान में चल रहे किसी भी सामान्य "डेटा ट्रांसफर" कमांड के लिए प्रगति दिखाता है, इसलिए मुझे पीआईडी ​​देखने की ज़रूरत नहीं है;
  • की तुलना में pv -d, फिर से मुझे पीआईडी ​​देखने की आवश्यकता नहीं है।

1
नोट: आप केवल कोर्यूटिल प्रक्रियाओं से अधिक की निगरानी कर सकते हैं। बस के साथ कमांड का नाम निर्दिष्ट करें --command <command-name>
jpaugh

1
यह कमाल का है!
फ्लोरिस

25

भागो dd, फिर, एक अलग खोल में, आह्वान निम्न आदेश:

pv -d $(pidof dd) # root may be required

यह ddप्रक्रिया के सभी खोले गए फ़ाइल डिस्क्रिप्टर पर pv प्राप्त आँकड़े बनाएगा । यह आपको दिखाएगा कि बफर पढ़ना और लिखना कहां है।


2
तथ्य के बाद काम करता है !? गजब का!!
jpaugh

3
यह बहुत अच्छा है। यह स्मृति-बैंडविड्थ + संदर्भ-स्विच ओवरहेड से बचता है वास्तव में 3 प्रक्रियाओं के माध्यम से सभी डेटा को पाइपिंग करता है! @jpaugh: मुझे लगता है कि यह सिर्फ /proc/$PID/fdinfoफ़ाइल स्थितियों के लिए दिखता है , और /proc/$PID/fdयह देखने के लिए कि कौन सी फाइलें (और इस प्रकार आकार)। तो हाँ, एक सुविधा के लिए बहुत अच्छा है, और अच्छा विचार है, लेकिन मैं इसे "अद्भुत" नहीं कहूंगा क्योंकि लिनक्स एपीआई हैं जो इसे किसी अन्य प्रक्रिया की फ़ाइल स्थिति को प्रदूषित करते हैं।
पीटर कोर्ड्स

@PeterCordes मुझे एहसास नहीं हुआ कि फ़ाइल-स्थिति कर्नेल द्वारा उजागर की गई थी। (मैं अपना जीवन सावधानी से pvअग्रिम रूप से पाइपलाइन तैयार करने में बिता रहा हूं ।) बेशक, मैंने एक बार यह मान लिया था कि मैंने देखा कि यह काम करता है।
jpaugh

9

वहाँ के लिए एक विकल्प है dd: dcfldd

dcfldd GNU dd का एक उन्नत संस्करण है जिसमें फोरेंसिक और सुरक्षा के लिए उपयोगी सुविधाएँ हैं।

स्टेटस आउटपुट - dcfldd ट्रांसफर किए गए डेटा की मात्रा और कितना लंबा ऑपरेशन होगा, के संदर्भ में इसकी प्रगति के उपयोगकर्ता को अपडेट कर सकता है।

dcfldd if=/dev/zero of=out bs=2G count=1 # test file
dcfldd if=out of=out2 sizeprobe=if
[80% of 2047Mb] 52736 blocks (1648Mb) written. 00:00:01 remaining.

http://dcfldd.sourceforge.net/
https://linux.die.net/man/1/dcfldd


यह एक लंबा कमांड नाम है ... स्पष्ट रूप से, यह नीच है। (+1)
jpaugh

7

एक प्रतिशत के रूप में आपको कुछ गणित करने होंगे, लेकिन आप पहले से ही शुरू करने के बाद भी मानव पठनीय रूप में dd की प्रगति प्राप्त कर सकते हैं, kill -USR1 $(pidof dd)

वर्तमान dd प्रक्रिया समान दिखाई देगी:

11117279 बाइट्स (11 MB, 11 MiB) कॉपी किए गए, 13.715 s, 811 kB / s


4
यह मूल रूप से वही चीज है जो status=progressदेती है
rakslice

1
मैं वास्तव में यह कहने के बारे में था कि वही स्थिति है जो स्थिति = प्रगति देती है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.