कैसे जांचें कि प्रक्रिया कितने समय से चल रही है?


242

मैं एक निगरानी एप से प्रक्रिया शुरू करके ऐसा करने से बचना चाहूंगा।

जवाबों:


311

साथ लिनक्स पर psसे procps(-ng)(और सबसे अन्य प्रणालियों इस के बाद से POSIX द्वारा निर्दिष्ट किया जाता):

ps -o etime= -p "$$" 

$$आप जिस प्रक्रिया की जांच करना चाहते हैं, उसका पीआईडी कहां है। यह प्रारूप में बीता समय लौटाएगा [[dd-]hh:]mm:ss

का उपयोग करना -o etimeबताता है psकि आप अभी बीता हुआ समय क्षेत्र चाहते हैं, और उस =के अंत में हेडर दबा देता है (बिना, आपको एक पंक्ति मिलती है जो कहती है ELAPSEDऔर फिर अगली पंक्ति पर समय; साथ, आपको समय के साथ बस एक पंक्ति मिलती है) ।

या, लिनक्स पर या FreeBSD 9.0 या इसके बाद के संस्करण (और संभवतः अन्य) पर procps-ng टूल सूट (3.3.0 या इसके बाद के संस्करण) के नए संस्करणों के साथ, उपयोग करें:

ps -o etimes= -p "$$"

(एक जोड़े के साथ s) सेकंड के रूप में स्वरूपित समय पाने के लिए, जो स्क्रिप्ट में अधिक उपयोगी है।

लिनक्स पर, psप्रोग्राम को इससे प्राप्त होता है /proc/$$/stat, जहां फ़ील्ड (देखें man proc) में से एक प्रक्रिया प्रारंभ समय है। यह दुर्भाग्य से, सिस्टम बूट के बाद से जिफ़ीस (लिनक्स कर्नेल में इस्तेमाल होने वाला एक मनमाना समय काउंटर) के रूप में निर्दिष्ट है। तो आपको उस समय को निर्धारित करना होगा जिस पर सिस्टम बूट हुआ (से /proc/stat), इस प्रणाली पर प्रति सेकंड जीफ्स की संख्या, और फिर एक उपयोगी प्रारूप में बीता हुआ समय पाने के लिए गणित करें।

यह HZ के मूल्य (यानी, प्रति सेकंड jiffies) को खोजने के लिए हास्यास्पद रूप से जटिल हो जाता है। sysinfo.cप्रॉप्स पैकेज में टिप्पणियों से , एक) ए) में कर्नेल हेडर फ़ाइल शामिल हो सकती है और यदि कोई अलग कर्नेल उपयोग किया जाता है तो recompile, B) पॉज़िक्स sysconf()फ़ंक्शन का उपयोग करता है, जो दुख की बात है, सी लाइब्रेरी में संकलित हार्ड-कोडित मान का उपयोग करता है, या C) कर्नेल से पूछें, लेकिन ऐसा करने के लिए कोई आधिकारिक इंटरफ़ेस नहीं है। तो, psकोड में कीचड़ की एक श्रृंखला शामिल है जिसके द्वारा यह सही मूल्य निर्धारित करता है। वाह।

इसलिए यह सुविधाजनक है जो psआपके लिए यह सब करता है। :)

लिनक्स पर उपयोगकर्ता @ 336_ नोटों के रूप में (यह पोर्टेबल नहीं है), आप statनिर्देशिका /proc/$$(जहां फिर $$से ब्याज की प्रक्रिया है) के लिए उपयोग, संशोधन, या स्थिति बदलने की तारीखों को देखने के लिए कमांड का उपयोग कर सकते हैं । तीनों संख्याएँ समान होनी चाहिए, इसलिए

stat -c%X /proc/$$

आपको समय देगा कि प्रक्रिया $$शुरू हो गई, सेकंड में युग के बाद से। यह अभी भी काफी नहीं है कि आप क्या चाहते हैं, क्योंकि आपको अभी भी गणित करने की आवश्यकता है कि वर्तमान समय से घटाकर समय समाप्त करने के लिए - मुझे लगता है कि कुछ date +%s --date="now - $( stat -c%X /proc/$$ ) seconds"ऐसा काम करेगा, लेकिन यह थोड़ा असहनीय है। एक संभावित लाभ यह है कि यदि आप -c%xइसके बजाय लंबे प्रारूप वाले आउटपुट का उपयोग करते हैं -c%X, तो आपको संपूर्ण-संख्या सेकंड से अधिक रिज़ॉल्यूशन प्राप्त होता है। लेकिन, अगर आपको इसकी आवश्यकता है, तो आपको संभवतः प्रक्रिया-ऑडिटिंग दृष्टिकोण का उपयोग करना चाहिए क्योंकि स्टेट कमांड को चलाने का समय सटीकता के साथ हस्तक्षेप करने वाला है।


1
नमस्ते! है etime=लिखने में कोई त्रुटि? मैं केवल etimeपुरुष पृष्ठों में पा सकता हूं ।
केंट पवार

16
@KentPawar यह एक टाइपो नहीं है। खाली =हैडर को दबा देता है। इसके बिना कोशिश करें, या कोशिश करेंps -p $$ -o etime="Silly Header Here"
Mattdm

4
ps -p $ (pgrep find) -o etime =
mafrosis

1
अच्छा लगा। मैं etimesखुद को पसंद करता हूं क्योंकि यह मशीन पठनीय है
असफंद काजी

1
@alexmurray सिर्फ कॉल करता है sysconf()और इसलिए आपको सी लाइब्रेरी से हार्ड-कोडेड वैल्यू देता है, जैसा कि कहा गया है, नहीं?
mattdm

36

पोर्टेबल:

% ps -o stime,time $$
STIME     TIME
Jan30 00:00:06

यानी उस शेल को 30 जनवरी को शुरू किया गया था और सीपीयू के समय के लगभग 6 सेकंड का समय था।

इस जानकारी को प्राप्त करने के लिए अधिक सटीक या अधिक पार्स करने योग्य लेकिन कम पोर्टेबल तरीके हो सकते हैं। अपने psआदेश या अपने procफाइल सिस्टम के प्रलेखन की जाँच करें ।

लिनक्स के तहत, यह जानकारी अंदर रहती है /proc/$pid/stat

awk '{print "CPU time: " $14+$15; print "start time: " $22}' /proc/$$/stat

सीपीयू समय jiffies में है; मुझे पता नहीं है कि शेल से जिफ़ी मूल्य कैसे पाया जाए। प्रारंभ समय बूट समय (पाया गया /proc/uptime) के सापेक्ष है ।


3
HZ (यानी, प्रति सेकंड jiffies) का मान ढूँढना हास्यास्पद रूप से जटिल हो जाता है! sysinfo.cक्रेप्स पैकेज में टिप्पणियों से , ए) में कर्नेल हेडर फाइल शामिल हो सकती है (और एक अलग कर्नेल का उपयोग किए जाने पर recompile, b) पॉज़िक्स sysconf () फ़ंक्शन का उपयोग करें, जो दुख की बात है, संकलित हार्ड-कोडित मान का उपयोग करता है c लाइब्रेरी, या c) कर्नेल से पूछें, और ऐसा करने के लिए कोई आधिकारिक इंटरफ़ेस नहीं है। तो, कोड में कीचड़ की एक श्रृंखला शामिल है जिसके द्वारा यह सही मूल्य निर्धारित करता है। वाह।
Mattdm

1
psमैनपेज कहा गया है कि timeकि "संचयी CPU समय"। मुझे लगता है कि ओपी क्या देख रहा था etime, या "प्रक्रिया शुरू होने के बाद बीता हुआ समय"। pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html
rinogo

1
ऐसा नहीं "पोर्टेबल" सब के बाद: FreeBSD पर "ps: stime: कीवर्ड नहीं मिला" । यह कम से कम समर्थन करता है etime, हालांकि।
n.st

18
ps -eo pid,comm,cmd,start,etime | grep -i X

X प्रक्रिया का नाम है


2
शायद एक grep -v grep जोड़ना चाहिए।
ब्रायन

ps -o pid,comm,cmd,start,etime -p Xपीआईडी एक्स को देखने के लिए
codeforester

13

ps-oआउटपुट स्वरूप निर्दिष्ट करने के लिए एक विकल्प लेता है , और उपलब्ध कॉलम में से एक है etime। मैन पेज के अनुसार:

etime - प्रक्रिया शुरू होने के बाद का समय समाप्त हो गया, [[dd-] hh:] mm: ss के रूप में।

इस प्रकार आप पीआईडी ​​पाने के लिए इसे चला सकते हैं और हर प्रक्रिया का समय समाप्त कर सकते हैं:

$ ps -eo pid,etime

यदि आप किसी विशेष PID (जैसे 12345) का बीता हुआ समय चाहते हैं, तो आप कुछ ऐसा कर सकते हैं:

$ ps -eo pid,etime | awk '/^12345/ {print $2}'

( संपादित करें : पता चलता है कि उपरोक्त आदेश के लिए एक छोटा वाक्यविन्यास है; देखें mattdm का उत्तर )


5

यह पता नहीं लगाएं कि यह अभी तक क्यों नहीं सुझाया गया है: लिनक्स पर आप stat()अपने पीआईडी ​​के लिए / proc / [nnn] निर्देशिका कर सकते हैं।

यह व्यवहार स्पष्ट रूप से प्रक्रिया शुरू करने के समय को वापस करने के लिए डिज़ाइन किया गया है, जिसे यह उच्च रिज़ॉल्यूशन पर कर सकता है, और जो कर्नेल जिफ़ के बिना सटीक रूप से कर सकता है क्योंकि कर्नेल (स्पष्ट रूप से) बस प्रासंगिक जानकारी की जांच कर सकता है। एक्सेस, डेटा-मोडिफिकेशन और स्टेटस चेंज फ़ील्ड्स सभी प्रक्रिया शुरू होने का समय वापस कर देते हैं।

सभी के लिए, आप stat(1)शेल में उपयोग कर सकते हैं , या stat(2)$ favourite_programming_language से उपयुक्त बाइंडिंग कर सकते हैं, इसलिए आपको बाहरी प्रक्रिया शुरू करने की आवश्यकता नहीं हो सकती है।

ध्यान दें कि यह FreeBSD पर काम नहीं करता /usr/compat/linux/procहै; वर्तमान समय में लौटाए गए / संशोधन / स्थिति-परिवर्तन समय और जन्म का समय UNIX युग है। अगर तुम मुझसे पूछते हो तो समर्थन काफी बेवकूफ है।


स्टेट ऑफ़ आउटपुट में मुझे जानकारी कहाँ दिखती है? मैं केवल एक्सेस, संशोधित और परिवर्तन देखता हूं।
22

नोट @Tshepang कि उन मूल्यों को सभी एक ही हैं, और वे कर रहे हैं की प्रक्रिया शुरू करने का समय। आपको अभी भी गणित करना है, लेकिन यह निश्चित रूप से बेहतर है कि मेरे जवाब में नोट किए गए जिफ़ियों को जानने की कोशिश करें।
Mattdm 16

आप इसे इस तरह कहते हैं: stat /proc/4480यह आपको प्रक्रिया के जन्म, परिवर्तन, संशोधन और एक्सेस की तारीखें देगा। यदि आपको प्रक्रिया आईडी की आवश्यकता है, तो बस "टॉप" का उपयोग करें
user890332

2

यदि आप समय चला सकते हैं और फिर एक कमांड निष्पादित कर सकते हैं तो आपको वही मिलेगा जो आप देख रहे हैं। आप पहले से चल रहे कमांड के खिलाफ ऐसा नहीं कर सकते।

[०]% समय सो २०

नींद 20 0.00s उपयोगकर्ता 0.00s प्रणाली 0% cpu 20.014 कुल


क्या आप जानते हैं कि मैं इसे चलाने की प्रक्रिया की निगरानी पर कैसे कर सकता हूं जब तक कि यह समाप्त न हो जाए?
22

1

आप statद्वारा उत्पादित स्टेटस फ़ाइल को देखकर प्रक्रिया का प्रारंभ समय प्राप्त कर सकते हैं proc, इसे dateवर्तमान प्रारूप से उपयोग और घटा सकते हैं:

echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))

13494आपकी प्रक्रिया कहां है?


1

$ ps -eo lstart प्रारंभ समय

$ ps -eo etime अवधि / बीता हुआ समय

$ ps -eo pid,lstart,etime | grep 61819
  PID                   STARTED     ELAPSED
  61819 Mon Sep 17 03:01:35 2018    07:52:15

61819 प्रक्रिया आईडी है।


Lstart उपयोग की समस्या हो सकती है, यह संबंध रखते हैं - unix.stackexchange.com/questions/274610/...
SLM

1

समय सेकंड में समाप्त हो गया: expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)


यह एक है कि का एक बहुत ही मामूली बदलाव होने के लिए मुझे लगता है पहले ही उल्लेख किया mattdm : date +%s --date="now - $( stat -c%X /proc/$$
जेफ स्कालर

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