चल रहे cp की प्रगति की जाँच कैसे करें?


54

क्या चल रही cp प्रक्रिया की प्रगति की जांच करना संभव है? कुछ प्रक्रियाएँ विभिन्न KILL संकेतों पर प्रतिक्रिया देती हैं ताकि आप जाँच सकें कि उनकी स्थिति क्या है। मुझे पता है कि मैं पैरामीटर -v के साथ cp चला सकता हूं लेकिन क्या होगा अगर वह करना भूल गया है, cp बहुत लंबे समय से चल रहा है और मैं जानना चाहता हूं कि कौन सी फाइल कॉपी की जा रही है, या कितने पहले से ही कॉपी किए गए थे।


अधिकांश समाधान (लिनक्स और संभवतया अन्य POSIX, जैसे मैक OS X) ऑफ-ट्रैक हो जाते हैं, जब रीड ऑपरेशंस लिखने के संचालन से बहुत तेज होते हैं, वास्तविक पूर्ण होने से पहले 100% प्रदर्शित होते हैं। इससे पहले कि वे वास्तव में प्रदर्शन कर रहे हैं, फाइल राइट्स कैश में ऑपरेशन लिखने का कारण है। उस समय, चीजों को ट्रैक करना मुश्किल होता है। यह चाल अंतर को कम कर सकती है: दूसरे टर्मिनल में while sleep 1 ; do sync ; done
स्टीफन गौरिचोन

जवाबों:


31

हां, लक्ष्य फ़ाइल और स्थानीय फ़ाइल पर स्टेटस चलाकर, और फ़ाइल का आकार प्राप्त करें,

अर्थात stat -c "%s" /bin/ls

और आपको दो मूल्य की तुलना करके कॉपी किए गए डेटा का प्रतिशत मिलता है, बस

एक बहुत ही बुनियादी कार्यान्वयन में जो इस तरह दिखेगा:

function cpstat()
{
  local pid="${1:-$(pgrep -xn cp)}" src dst
  [[ "$pid" ]] || return
  while [[ -f "/proc/$pid/fd/3" ]]; do
    read src dst < <(stat -L --printf '%s ' "/proc/$pid/fd/"{3,4})
    (( src )) || break
    printf 'cp %d%%\r' $((dst*100/src))
    sleep 1
  done
  echo
}

4
आपके सुझाव की डुप्लिकेट पोस्ट करने का इरादा नहीं है, इसलिए मैंने यहां कोड जोड़ा है। आशा है आप बुरा नहीं मानेंगे
मैनेटवर्क

@manatwork आह धन्यवाद, मैं सिर्फ एक पूर्ण उदाहरण देने में आलसी हो रहा था :-)
डेज़ी

बहुत बढ़िया, यह सभी सर्वरों पर मेरे टूलबॉक्स में जा रहा है! धन्यवाद!
ACK_stoverflow

लिनक्स 4 पर, एक पुराने यूएसबी रीडर पर एक सस्ते माइक्रो एसडी पर एक 500 जीबी फ़ाइल के लिए एक तेज यूएसबी ड्राइव से cp'ing: cp और सिंक कई दर्जन मिनटों के लिए लटका हुआ है। लेकिन अगर मैं सोर्स और डेस्टिनेशन फाइल को स्टेट करता हूं तो मुझे cp के शुरू होने के बाद दोनों 10 पर एक ही नंबर मिलता है।
gcb

40

मैक ओएस एक्स के हाल के संस्करणों पर आप सिर्फ हिट कर सकते हैं CTRL+ Tप्रगति देखने के लिए। से सीपी OSX के लिए 10.6 आदमी पेज (1) :

 "If cp receives a SIGINFO (see the status argument for stty(1)) signal,
 the current input and output file and the percentage complete will be
 written to the standard output."

हिटिंग CTRL+ TOSX सहित BSD-ish मशीनों पर SIGINFO के साथ वर्तमान प्रक्रिया को इंगित करने के बराबर है।

यह dd (1) के लिए भी काम करता है ।

मुझे नहीं लगता कि लिनक्स में यह SIGINFO तंत्र है, और संकेतों के बारे में cp (1) के लिए GNU मैन पेज में कुछ भी नहीं दिखता है जो प्रगति को रिपोर्ट करने के लिए उपयोग किया जा सकता है।


1
वाह! यह मुझे बहुत अधिक जानकारी नहीं देता है, लेकिन यह जानना पर्याप्त है कि मेरा mvजीवित है। धन्यवाद!
डैन रोसेनस्टार्क

यह केवल आपको व्यक्तिगत फ़ाइल के लिए प्रतिशत पूर्ण बताता है कि यह सिग्नल प्राप्त होने पर कॉपी कर रहा है। यह पूरी नौकरी का प्रतिशत पूरा नहीं करता है जो यह कर रहा है।
जो सी

21

जब आप बहुत सारी फ़ाइलों की प्रतिलिपि बना रहे हों, du -s /path/to/destinationया find /path/to/destination | wc -lआपको इस बात का अंदाजा लगाते हैं कि पहले से ही कितना कुछ किया जा चुका है।

आप यह पता लगा सकते हैं lsof -p1234कि 1234 की प्रक्रिया आईडी किस फाइल के साथ कॉपी की जा रही है cp। कई प्रणालियों के तहत, pgrep -x cpनाम से चलने वाली सभी प्रक्रियाओं की प्रक्रिया आईडी की रिपोर्ट करता है cp। यह बहुत उपयोगी नहीं हो सकता है क्योंकि जिस क्रम में किसी दिए गए निर्देशिका के अंदर फ़ाइलों की प्रतिलिपि बनाई जाती है वह अनिवार्य रूप से अप्रत्याशित है (लिनक्स के तहत एक बड़ी निर्देशिका में, ls --sort=noneआपको बताएगा, एक निर्देशिका पेड़ के साथ, कोशिश करें find)।

lsof -p1234यह भी बताता है कि कॉलम cpमें वर्तमान फ़ाइल के लिए कितने बाइट्स पहले ही पढ़े और लिखे जा चुके हैं OFFSET

लिनक्स के तहत, /proc/$pid/io(फिर, के लिए cpप्रक्रिया के पीआईडी ​​का उपयोग करें) में आईओ उपयोग के आंकड़े हैं $pidfrcharमूल्य बाइट्स है कि इस प्रक्रिया को पढ़ने की कुल संख्या है, और wcharबाइट्स है कि इस प्रक्रिया में लिखा है की संख्या है। इसमें न केवल फाइलों में डेटा, बल्कि निर्देशिका में मेटाडेटा भी शामिल है। आप उस आंकड़े की तुलना अनुमानित आंकड़े के साथ कर सकते हैं du /path/to/source(जो केवल फ़ाइल डेटा की गणना करता है)। read_bytesऔर write_bytesकेवल वही शामिल है जो स्टोरेज से पढ़ा या लिखा गया है, अर्थात यह टर्मिनल डायग्नॉस्टिक्स और डेटा को पहले से ही कैश में या अभी भी बफ़र्स में शामिल नहीं करता है।


4
वास्तविक समय के लिए:watch lsof -p1234
mchid

3
या सभी एक ही बार में:watch lsof -p`pgrep -x cp`
माइक

15

एक अपेक्षाकृत नया उपकरण जो वास्तव में प्रगति करता है (पूर्व में सीवी [कोरुटिल्स दर्शक]) है।

यह क्या है?

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

यह कैसे काम करता है?

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


5
इस उपयोग को अब प्रगति कहा जाता है: github.com/Xfennec/progress
Taavi Ilves

14

इस के लिए मेरी पसंदीदा चाल में से एक (लिनक्स के तहत) की पीआईडी पता लगाने के लिए है cp(का उपयोग कर प्रक्रिया ps | grep cpया समान), और उसके बाद में देखने के लिए /proc/$PID/fd/और /proc/$PID/fdinfo/

$ cp -r y z
^Z
$ ls -l /proc/8614/fd
lrwx------ 1 jander jander 64 Aug  2 15:21 0 -> /dev/pts/4
lrwx------ 1 jander jander 64 Aug  2 15:21 1 -> /dev/pts/4
lrwx------ 1 jander jander 64 Aug  2 15:20 2 -> /dev/pts/4
lr-x------ 1 jander jander 64 Aug  2 15:21 3 -> /home/jander/y/foo.tgz
l-wx------ 1 jander jander 64 Aug  2 15:21 4 -> /home/jander/z/foo.tgz

यह आपको दिखाएगा कि प्रक्रिया में कौन सी फाइलें खुली हैं। यदि आप यह देखना चाहते हैं कि प्रक्रिया कितनी दूर है ...

$ cat /proc/8614/fdinfo/3
pos:    105381888
flags:  0500000

posपैरामीटर पढ़ने (या लिख) सूचक की स्थिति, बाइट में है।


7

कुछ चीजें हैं जो आप कर सकते हैं। आप straceइसे देख सकते हैं कि यह क्या कर रहा है (आउटपुट प्रचुर हो सकता है!):

strace -p [cp के pid]

या आप यह lsofबता सकते हैं कि वर्तमान में कौन सी फाइलें खुली हैं:

lsof -p [cp का pid]

यदि आप एक बड़ा पुनरावर्ती चला रहे हैं cp, तो आप pwdxवर्तमान कार्यशील निर्देशिका को प्राप्त करने के लिए उपयोग कर सकते हैं , जो आपको कुछ विचार दे सकता है कि यह कैसे कर रहा है:

pwdx [cp के pid]

4

जबकि ओपी ने विशेष रूप से यह देखने की क्षमता का उल्लेख किया है कि "cp" कमांड कैसे प्रगति कर रहा है, यह कहा जाना चाहिए कि अन्य उपयोगिताओं इस विशेष मुद्दे के लिए बेहतर हैं।

उदाहरण के लिए:

rsync -avP FROM TO

फ़ाइल / फ़ोल्डर से FROM फ़ाइल / फ़ोल्डर की प्रतिलिपि बनाने की प्रगति दिखाएगा।


# rsync -avP Video.mp4  /run/media/user1/3.8G/

sending incremental file list
Video.mp4
    565,170,046 100%   51.23MB/s    0:00:10 (xfr#1, to-chk=0/1)

sent 565,308,115 bytes  received 134 bytes  5,210,214.28 bytes/sec
total size is 565,170,046  speedup is 1.00

और rsync आपको बताएगा कि रास्ते में यह कितना (और अंतरण दर) कॉपी किया गया है। यह सिंगल फाइल या फोल्डर दोनों के लिए एक ही मशीन या नेटवर्क पर काम करता है।


2
आप गलत प्रश्न का उत्तर दे रहे हैं। आप जिस प्रश्न की तलाश कर रहे हैं वह है: unix.stackexchange.com/questions/2577/… , जिसमें पहले से ही एक उत्तर का उल्लेख है rsync
मूरू

1

आप क्या कर सकते हैं गंतव्य पर फ़ाइलों की जाँच करें।

यदि आपकी cp कमांड कुछ ऐसी है जैसे cp -a <my_source> <my_dest_folder>मैं जांच करूंगा कि कौन सी फाइलें पहले से ही कॉपी की गई हैं <my_dest_folder>और प्रत्येक फाइल का आकार, तो मैं प्रगति देख सकता हूं। यदि <my_source>थोड़ा जटिल है (निर्देशिकाओं की कई परतें) तो एक छोटी स्क्रिप्ट स्थिति की जांच करने में सक्षम होगी। हालाँकि इस तरह की स्क्रिप्ट I / O का थोड़ा सा उपभोग कर सकती है जो तब cpप्रक्रिया द्वारा उपयोग नहीं किया जाएगा ।


1

यह उपकरण एक लिनक्स यूटिलिटी कमांड है, जो वर्तमान में आपके सिस्टम पर चल रहे कोरट्यूट्स बेसिक कमांड्स (cp, mv, dd, tar, gzip / gunzip, cat इत्यादि) की तलाश करता है और कॉपी किए गए डेटा का प्रतिशत प्रदर्शित करता है:

https://github.com/Xfennec/cv


1

मैं जोड़ना चाहूंगा cpv, इसके लिए थोड़ा रैपर pvमैंने लिखा था कि इसके उपयोग की नकल करता है cp

सरल और उपयोगी

यहाँ छवि विवरण दर्ज करें

आप इसे यहाँ प्राप्त कर सकते हैं



0

उपयोग करें pv -d:

-d PID[:FD], --watchfd PID[:FD]
डेटा स्थानांतरित करने के बजाय, FDप्रक्रिया का फ़ाइल विवरण देखें PIDऔर उसकी प्रगति दिखाएं। […] यदि केवल एक PIDनिर्दिष्ट किया गया है, तो उस प्रक्रिया को देखा जाएगा, और इसे खोलने वाले सभी नियमित फ़ाइलों और ब्लॉक उपकरणों को प्रगति पट्टी के साथ दिखाया जाएगा। pvप्रक्रिया से बाहर हो जाएंगे जब प्रक्रिया PIDबाहर निकालता है।

( स्रोत )

अपने चलने का पीआईडी ​​पता करें cp( pidof cp), मान लें कि यह 12345 है; तो बस

pv -d 12345

टिप्पणियाँ:

  • pvउसी उपयोगकर्ता के रूप में चलाएं जो चलाता है cp(या रूट के रूप में)।
  • चूंकि कॉपी करने का अर्थ है एक फ़ाइल को पढ़ना और दूसरे को लिखना, एक समय में दो फ़ाइलों की निगरानी करने की अपेक्षा करें।
  • यदि cpइस समय छोटी फ़ाइलों को संसाधित किया जा रहा है, तो आप शायद उन सभी को आउटपुट में नहीं देखेंगे (एक छोटी फ़ाइल pvइसे लेने के लिए बहुत तेज़ी से बंद हो सकती है )। फिर भी कुछ दिखाई देंगे, तो भी आप यह बता पाएंगे कि क्या cpकरता है।
  • pv -d "$(pidof cp)"काम हो सकता है; लेकिन अगर वहाँ एक से अधिक cpचल रहा है, यह काम नहीं करेगा। नहीं है pidof -sजो सबसे अधिक एक पीआईडी पर देता है, लेकिन आप यकीन है कि यह सही से संबद्ध हो जाएगी नहीं किया जा सकता cpकई देखते हैं अगर प्रक्रिया।

-1

आप प्रक्रिया को संकेत भेज सकते हैं:

kill -SIGUSR1 pid

जब तक आप Ctrl-C दबाते हैं या प्रक्रिया पूरी हो जाती है, तब तक स्क्रिप्ट बनाने के लिए यह और भी उपयोगी होता है:

while [ : ] ; do kill -SIGUSR1 $1 && sleep 1m || exit ; done

Dd के लिए काम करता है। Cp के लिए काम नहीं करता है । हो सकता है कि आपको दूसरे सिग्नल का इस्तेमाल करना पड़े। मैंने एक बार SIGINFO की कोशिश की, लेकिन यह इंटेल प्लेटफॉर्म पर मौजूद नहीं है।

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