जब एक प्रक्रिया शुरू हुई थी


31

यह जानने के लिए कि एक प्रक्रिया कब शुरू हुई थी, मेरा पहला अनुमान उस समय की जाँच करना था जब /proc/<pid>/cmdline पिछली बार लिखा / संशोधित किया गया था।

psएक STARTक्षेत्र भी दिखाता है । मुझे लगा कि ये दोनों स्रोत समान होंगे। कभी-कभी वे समान नहीं होते हैं। यह कैसे हो सकता है?


जवाबों:


44

कम से कम लिनक्स पर, आप यह भी कर सकते हैं:

ps -o lstart= -p the-pid

अधिक उपयोगी शुरुआत समय के लिए।

ध्यान दें कि यह वह समय है जब प्रक्रिया शुरू की गई थी, जरूरी नहीं कि जिस समय यह वर्तमान में निष्पादित हो रहा था वह आदेश लागू किया गया था। प्रक्रियाएँ (और आम तौर पर) अपने जीवनकाल में एक से अधिक कमांड चला सकती हैं। और कभी-कभी अन्य प्रक्रियाओं को आदेश देता है।

में फ़ाइलों के mtimes /procलिनक्स पर (कम से कम) आम ​​तौर पर तारीख होती है जब उन फ़ाइलों को त्वरित किया जाता था, जो कि पहली बार कुछ उन्हें एक्सेस करने या निर्देशिका सामग्री को सूचीबद्ध करने की कोशिश करता था।

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

$ sh -c 'date +%T.%N; sleep 3; echo /proc/"$$"/xx*; sleep 3; stat -c %y "/proc/$$/cmdline"'
13:39:14.791809617
/proc/31407/xx*
2013-01-22 13:39:17.790278538 +0000

विस्तार /proc/$$/xx*ने शेल को उस सामग्री को पढ़ने के लिए /proc/$$प्रेरित किया जिसके कारण सामग्री थीcmdline पड़ता है फ़ाइल को त्वरित किया जा सकता है।

इसे भी देखें: सॉकेट के टाइमस्टैम्प में / proc // fd


11

खरीद एक आभासी फ़ाइल प्रणाली है, इसलिए मैं किसी भी फ़ाइल स्थिति की जानकारी पर निर्भर नहीं होता।

प्रक्रिया का प्रारंभ समय / प्रोक / पीआईडी ​​/ स्टेट कॉलम 22 पर स्थित है । यह सिस्टम बूट के बाद jiffies में दिया जाता है। इसे सेकंड में बदलने के लिए आपको इसे विभाजित करना होगा sysconf(_SC_CLK_TCK)जिसके द्वारा अधिकांश प्रणालियों के लिए 100 (लेकिन सभी नहीं!)।

सिस्टम बूट का समय प्राप्त करने के लिए आप सेकंड में वर्तमान अपटाइम निर्धारित करते हैं जो कि / proc / uptime का पहला मूल्य है

उन दो नंबरों के होने के बाद आप पहले को दूसरे से घटाते हैं और आपको प्रोग्राम शुरू करने के बाद से कुछ सेकंड्स की संख्या मिलती है।

उदाहरण ( पिजिन के लिए ):

PID=$(pidof pidgin)
STARTTIME=$(awk '{print int($22 / 100)}' /proc/$PID/stat)
UPTIME=$(awk '{print int($1)}' /proc/uptime)
NOW=$(date +%s)
DIFF=$((NOW - (UPTIME - STARTTIME)))
date -d @$DIFF

नोट: यह सरल उदाहरण काम नहीं करता है यदि pidofरिटर्न मल्टीपिड पीआईडी ​​देता है।


खरीद / <pid> / cmdline के बारे में कोई भी विचार कब लिखा जाता है? अच्छी तरह से खरीद के किसी भी / <pid> उस बात के लिए प्रविष्टियाँ।
स्वैर

2
आमतौर पर उन फ़ाइलों को कर्नेल द्वारा गतिशील रूप से उत्पन्न किया जाता है जब भी आप उन्हें पढ़ने की कोशिश करते हैं और उनमें से अधिकांश में एक गतिशील सामग्री भी होती है। cmdline नहीं है लेकिन मैं सोच भी नहीं सकता कि एक आधिकारिक नीति है जो कहती है कि प्रक्रिया स्टार्टअप पर एक बार बनाई जानी चाहिए और फिर कभी नहीं छुआ जाना चाहिए।
scai

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