Ps के लिए cputime का आउटपुट स्वरूपित करें


13

मैं एक स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो एक प्रक्रिया के CPU उपयोग को एक अंतराल पर (एक ग्राफ बनाने के लिए) मॉनिटर कर सकता है।

अब तक, यह वह कमांड है जिसका मैं उपयोग कर रहा हूं

ps -p $PROCID -o cputime,etimes

मेरी एकमात्र चिंता यह है कि क्रिप्टाइम का उत्पादन प्रतीत होता है [dd]hh:mm(या ऐसा ही कुछ, अब मेरे सिर के ऊपर से याद नहीं आ रहा है)

वहाँ सेकंड में cputime प्रारूप करने के लिए एक तरीका है, etime की तरह -> etimes सेकंड में बीता समय पाने के लिए?

संपादित करें: यह वह आउटपुट है जो मैं वर्तमान में प्राप्त कर रहा हूं

2-03:01:33 2653793

मैं पहले पैरामीटर को सेकंड में स्वरूपित करना चाहता हूं, दिन-घंटे: मिनट: सेकंड नहीं।


क्या आप अब प्राप्त होने वाले आउटपुट को जोड़ सकते हैं और आप जिस आउटपुट को प्राप्त करना चाहते हैं?
बस_मे

@Simply_Me मैंने पोस्ट को संपादित किया है
dreadiscool

@ जॉन १०२४ हाँ, यह है, कि दिनों की राशि है।
dreadiscool

जवाबों:


9

यह सेकंड में पहली बार धर्मान्तरित होता है:

ps -p $PROCID -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'

एक उदाहरण के रूप में, ps कमांड का उत्पादन होता है:

$ ps -p 5403 -o cputime,etimes
    TIME ELAPSED
01:33:38 1128931

awkआदेश संसाधित करता है कि और रिटर्न:

ps -p 5403 -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'
5618 1128931

व्याख्या

  • -F'[: ]+'

    यह awk को कॉलोन और रिक्त स्थान दोनों को क्षेत्र विभाजक मानने के लिए कहता है। इस तरह, घंटे, मिनट और सेकंड अलग-अलग फ़ील्ड के रूप में दिखाई देते हैं।

  • /:/ {t=$3+60*($2+60*$1); print t,$NF}

    प्रारंभिक /:/केवल उन लाइनों पर काम करने के लिए कोड को प्रतिबंधित करता है जिनमें एक बृहदान्त्र शामिल है। यह हेडर लाइनों को हटा देता है। सेकंड की संख्या की गणना घंटे, मिनट, सेकंड से होती है t=$3+60*($2+60*$1)। इसके बाद के परिणामी मूल्य को tसमय बीतने के साथ मुद्रित किया जाता है।

दिनों को संभालना

अगर psदिन, घंटे, मिनट, सेकंड का उत्पादन होता है:

2-03:01:33

फिर, इस कोड का उपयोग करें:

ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ {t=$4+60*($3+60*($2+24*$1)); print t,$NF}'

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

ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ && NF==5 { t=$4+60*($3+60*($2+24*$1)); print t,$NF} /:/ && NF==4 {t=$3+60*($2+60*$1); print t,$NF}'

मुझे माफ कर दो अगर मुझसे गलती हो जाए, लेकिन ऐसा नहीं लगता कि यह आदेश दिनों में हो रहा है, जिसे पहले से ही लिया जा सकता है
dreadiscool

यह सही है: मेरे सिस्टम ने किसी भी प्रक्रिया के लिए दिन नहीं दिखाए। मैं अनुमान लगा सकता हूं कि कौन से दिन अच्छे लग सकते हैं, लेकिन क्या आप एक वास्तविक उदाहरण प्रदान कर सकते हैं?
जॉन 1024

2-03: 01: 33 2 दिन, 3 घंटे, 1 मिनट और 33 सेकंड है। दिन हमेशा हालांकि पहले से तैयार नहीं होते हैं। यदि यह प्रक्रिया 24 घंटे से अधिक समय तक जीवित रही है, तो मेरे सिस्टम पर यह पूर्व निर्धारित है। आपकी मदद के लिए धन्यवाद अब तक btw, मैं इसकी सराहना करता हूं
dreadiscool

@ user1772510 दिनों को संभालने के लिए उत्तर अपडेट किया गया।
जॉन 1024

आपकी सभी मदद के लिए धन्यवाद, अगर मैं उत्थान कर सकता / सकती हूं तो मैं भी इस समुदाय में नहीं (पर्याप्त प्रतिनिधि नहीं) मैं इसकी गहराई से सराहना करता हूं!
dreadiscool

2

यदि आप खेल में जागना नहीं चाहते हैं, तो शुद्ध बैश समाधान (t_str में तैयार स्ट्रिंग, सेकंड में डीकोड किया गया समय होता है):

# Decode the CPU time format [dd-]hh:mm:ss.
IFS="-:" read c1 c2 c3 c4 <<< "$t_str"
if [ -n "$c4" ]
then
  t_sec=$((10#$c4+60*(10#$c3+60*(10#$c2+24*10#$c1))))
else
  t_sec=$((10#$c3+60*(10#$c2+60*10#$c1)))
fi

0

आप निर्दिष्ट नहीं करते हैं कि यह किस ऑपरेटिंग सिस्टम के लिए है; यदि यह लिनक्स है, और यह देखते हुए कि आप एक विशिष्ट प्रक्रिया की निगरानी करने में रुचि रखते हैं, तो आपको विवरण के लिए मैनुअल पेज /proc/$PROCID/statदेखना अधिक उचित लग सकता है proc(5)

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