कैसे एक लिनक्स प्रक्रिया के uptime खोजने के लिए


69

मैं किसी दिए गए लिनक्स प्रक्रिया के अपटाइम को कैसे खोज सकता हूं।

ps aux | grep gedit | grep -v grep

मुझे पूरी जानकारी देता है जिसमें वह समय शामिल है जिस पर प्रक्रिया शुरू की गई थी। मैं विशेष रूप से स्विच की तलाश कर रहा हूं जो कि मिलीसेकंड में एक प्रक्रिया के अपटाइम को लौटाता है।

धन्यवाद

जवाबों:


113

जैसा कि "अपटाइम" के कई अर्थ हैं, यहां एक उपयोगी कमांड है।

ps -eo pid,comm,lstart,etime,time,args

यह आदेश कई अलग-अलग समय-संबंधित स्तंभों के साथ सभी प्रक्रियाओं को सूचीबद्ध करता है। इसमें निम्नलिखित कॉलम हैं:

PID COMMAND                          STARTED     ELAPSED     TIME COMMAND

PID= प्रोसेस आईडी
पहले COMMAND= बिना विकल्प और तर्कों के बिना केवल कमांड नाम
STARTED= निरपेक्ष समय प्रक्रिया शुरू की गई थी
ELAPSED= प्रक्रिया शुरू होने के बाद का समय समाप्त हो गया ( दीवार घड़ी समय ), प्रारूप [[dd-] hh:] mm: ss TIME= संचयी CPU समय, "[dd-] hh: mm: ss" प्रारूप
दूसरा COMMAND= फिर से कमांड, इस बार अपने सभी उपलब्ध विकल्पों और तर्कों के साथ।


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

1
यह सवाल मिलीसेकंड
yohann.martineau

दुर्भाग्य से, व्यस्तबॉक्स 1.29.3 ने एटिमी के लिए प्रारूपण को तोड़ दिया, इसलिए पार्सिंग के लिए उस पर भरोसा न करें।
डैनी दुलाई

10

यदि आपके पास सीमित संस्करण है psजैसे कि इसमें पाया जाता है busybox, तो आप टाइमस्टैम्प को देखकर प्रक्रिया शुरू कर सकते हैं /proc/<PID>। उदाहरण के लिए, यदि आप जिस पीड को देखना चाहते हैं, वह 55 है ...

# ls -al /proc | grep 55
dr-xr-xr-x    7 root     root             0 May 21 05:53 55

... और फिर इसकी वर्तमान तिथि से तुलना करें ...

# date
Thu May 22 03:00:47 EDT 2014

यह वर्तमान गुठली पर अब काम नहीं कर रहा है।
गोर्टजेनरेटर

7

मुझे लगता है कि आप बस चला सकते हैं:

$ stat /proc/1234

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

उदाहरण दो प्रक्रियाओं के साथ एक ही मिनट के सेकंड में शुरू हुए लेकिन एक ही मिलीसेकंड में नहीं:

$ stat /proc/9355
...
Access: 2017-11-13 17:46:39.778791165 +0100
Modify: 2017-11-13 17:46:39.778791165 +0100
Change: 2017-11-13 17:46:39.778791165 +0100
$ stat /proc/9209
...
Access: 2017-11-13 17:46:39.621790420 +0100
Modify: 2017-11-13 17:46:39.621790420 +0100
Change: 2017-11-13 17:46:39.621790420 +0100

4

5 साल के बाद इतनी सरल बात का ठीक से जवाब नहीं दिया गया है?

मुझे नहीं लगता कि आप सटीक रूप से मिलीसेकंड प्राप्त कर सकते हैं। जैसे। यदि आप देखते हैं man procfsऔर देखते हैं /proc/$$/statकि किसने 22 को स्टार्टटाइम के रूप में रखा है, जो "क्लॉक टिक्स" में है, तो आपके पास कुछ अधिक सटीक होगा, लेकिन क्लॉक टिक पूरी तरह से स्थिर दर ('दीवार घड़ी समय' के सापेक्ष) और नहीं जाएगा बंद हो ... सो रही है और कुछ चीजें (ntpd मुझे लगता है) इसे ऑफसेट। उदाहरण के लिए, ntpd पर चलने वाली मशीन पर, 8 दिनों के ऊपर और कभी नहीं सोया है, dmesg -Tएक ही समस्या है (मुझे लगता है ...), और आप इसे यहाँ देख सकते हैं:

# date; echo h > /proc/sysrq-trigger; dmesg -T | tail -n1 ; date
Fri Mar  3 10:26:17 CET 2017
[Fri Mar  3 10:26:16 2017] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(V) show-blocked-tasks(w) 
Fri Mar  3 10:26:17 CET 2017

यहाँ सेकंड है:

# example pid here is just your shell
pid=$$

# current unix time (seconds since epoch [1970-01-01 00:00:00 UTC])
now=$(date +%s)

# process start unix time (also seconds since epoch)
# I'm fairly sure this is the right way to get the start time in a machine readable way (unlike ps)...but could be wrong
start=$(stat -c %Y /proc/"$pid")

# simple subtraction (both are in UTC, so it works)
age=$((now-start))

printf "that process has run for %s seconds\n" "$age"

3

हाँ, बहुत पुराना और अभी तक बहुत मुश्किल सामान। मैंने उपरोक्त प्रस्तावित "स्टेट" विधि के साथ कोशिश की, लेकिन क्या होगा अगर मैंने कल "पीआईडी" खरीद लिया था? इसका मतलब है कि कल के समय की मुहर के साथ मेरी साल पुरानी प्रक्रिया को दिखाया गया है। नहीं, मैं क्या जरूरत नहीं :(

नए लोगों में, यह सरल है:

ps -o etimes -p <PID>
ELAPSED
339521

इतना सरल है। समय सेकंड में मौजूद है। इसके लिए आपको जो भी आवश्यक हो वह करें। कुछ पुराने बक्सों के साथ, स्थिति कठिन है, क्योंकि वहाँ कोई etimes नहीं है। एक पर भरोसा कर सकता है:

ps -o etime -p <PID>
ELAPSED
76-03:26:15

जो कि dd-hh: mm: ss फॉर्मेट में "बिट" अजीब है। आगे की गणना के लिए उपयुक्त नहीं है। मैंने इसे सेकंड में पसंद किया होगा, इसलिए मैंने इसका उपयोग किया:

ps -o etime -p <PID> --no-headers | awk -F '(:)|(-)' 'BEGIN{a[4]=1;a[3]=60;a[2]=3600;a[1]=86400;s=0};{for (i=NF;i>=1;i--) s=s+a[i]*$i}END{print s}'
339544

यह पुराने सिस्टम पर करने का वास्तव में एक अच्छा तरीका है, धन्यवाद :)
रोबॉटजॉनी

व्यस्तता के आउटपुट को पार्स न करें क्योंकि बिजीबॉक्स 1.29.3 ने प्रारूप को बदल दिया है। इसके बजाय स्टेट + /
प्रोक

-1
[root@ip-x-x-x-x ec2-user]# ps -p `pidof java` -o etimes=
 266433

pidof java => जावा प्रक्रिया के लिए प्रक्रिया आईडी

etimes= => समय सेकंड में और '=' हैडर को हटाने के लिए है

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