एक कमांड के दौरान उत्पादन समय बीतने के लिए यूनिक्स कमांड है?


0

मुझे timeयह पता लगाना बहुत पसंद है कि एक कमांड को निष्पादित करने में कितना समय लगता है, लेकिन जब उप-कमांड्स को आंतरिक रूप से निष्पादित करने वाली कमांड्स के साथ काम करना (और आउटपुट प्रदान करता है जो आपको यह बताने की अनुमति देता है कि उन सब-कमांड्स में से प्रत्येक कब चलना शुरू होता है) तो यह वास्तव में बहुत अच्छा होगा सेकंड (या मिलीसेकंड) की संख्या के बाद बताने में सक्षम एक विशिष्ट उप-कमांड चलने लगी।

जब मैं उप-कमान कहता हूं, तो वास्तव में बाहर से इनको अलग करने का एकमात्र तरीका मानक बाहर मुद्रित कुछ भी है।

वास्तव में ऐसा लगता है कि यह एक विकल्प होना चाहिए time


ऐसे आदेश हैं जो कुछ भी प्रिंट नहीं करते हैं। इसके अलावा, एक कमांड मौजूद हो सकता है जो कुछ आउटपुट करता है, थोड़ा इंतजार करता है, और कुछ और ( watch, tail -f) आउटपुट करता है ।
कोरोबा

1
timeकिसी भी निष्पादन योग्य को मापने के लिए एक कमांड है, न केवल शेल स्क्रिप्ट। आउटपुट लाइनों का कोई मतलब नहीं है प्रति se (जैसा कि @choroba पहले से ही नोट किया गया है)। तो timeकभी भी ऐसा कोई विकल्प नहीं होगा। यह बेकार होगा। यह एक बहुत विशिष्ट मामला है जो आपके लिए और उस विशिष्ट स्क्रिप्ट के लिए समझ में आता है।
drk.com.ar

जवाबों:


3

यह बताने के लिए वास्तव में बहुत अच्छा होगा कि एक विशिष्ट उप-कमांड कितने सेकंड (या मिलीसेकंड) चलने लगा

इस bashचर का उपयोग करने के लिए एक संभावना है :

सेकंड

यह चर शेल शुरू होने के बाद से कुछ सेकंड तक फैलता है। इस चर के लिए असाइन किए गए मान के लिए गणना को रीसेट करता है, और विस्तारित मान असाइन किए गए सेकंड के बाद से असाइन किए गए मान को निर्दिष्ट करता है।

आउटपुट स्ट्रीम के साथ संयोजन करने के लिए, इस समर्पित स्क्रिप्ट पर विचार करें जो प्रत्येक इनपुट लाइन के लिए टाइमस्टैम्प जोड़ता है:

$ cat timestamp-output
#!/bin/bash
while read line
do
  printf "%05d %s\n" $SECONDS "$line"
done

और उस स्क्रिप्ट में अपनी स्क्रिप्ट के आउटपुट को पाइप करें।

$ your-script | timestamp-output

उदाहरण:

$ cat your-script
#!/bin/bash
for i in 1 2 3 4
do
  echo "step $i started";
  sleep $(($RANDOM%10));
done

$ your-script | timestamp-output

आउटपुट:

00000 स्टेप 1 ने शुरू किया
00002 स्टेप 2 ने शुरू किया
00010 स्टेप 3 ने शुरू किया
00015 स्टेप 4 ने शुरू किया


यह केवल उत्पादन लाइनों को टाइमस्टैम्प के लिए परिष्कृत किया जा सकता है जो एक उप-कमांड की शुरुआत का संकेत देते हैं, यह मानते हुए कि वे greped हो सकते हैं:

#!/bin/bash
regex="^start of command"
while read line
do
 if [[ "$line" =~ $regex ]]; then
   printf "%05d %s\n" $SECONDS "$line"
 else
   echo "$line"
 fi
done

नमूना स्क्रिप्ट:

#!/bin/bash
for i in 1 2 3 4
do
  echo "start of command: $i";
  echo some output
  echo other output
  sleep $(($RANDOM%10));
done

नमूना उत्पादन:

00000 कमांड की शुरुआत: 1
कुछ उत्पादन
अन्य उत्पादन
00002 कमांड की शुरुआत: 2
कुछ उत्पादन
अन्य उत्पादन
00006 कमांड की शुरुआत: 3
कुछ उत्पादन
अन्य उत्पादन
00008 कमांड की शुरुआत: 4
कुछ उत्पादन
अन्य उत्पादन

1

यदि आपको यह पता लगाने की आवश्यकता है कि बच्चे की प्रक्रियाएं कब शुरू होती हैं, तो आप strace -f -ttआउटपुट का उपयोग और विश्लेषण कर सकते हैं , या संभावित रूप से आपके लिए अपनी स्क्रिप्ट को रोल कर सकते हैं।

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