วิธีค้นหาสถานะการออนไลน์ของกระบวนการ linux


69

ฉันจะค้นหาสถานะการออนไลน์ของกระบวนการ linux ที่ระบุได้อย่างไร

ps aux | grep gedit | grep -v grep

ให้ข้อมูลกับฉันมากมายซึ่งรวมถึงเวลาที่กระบวนการเริ่มต้น ฉันกำลังมองหาสวิตช์โดยเฉพาะซึ่งจะคืนค่าสถานะการออนไลน์ของกระบวนการเป็นมิลลิวินาที

ขอบคุณ

คำตอบ:


113

เนื่องจาก "uptime" มีความหมายหลายประการนี่คือคำสั่งที่มีประโยชน์

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

คำสั่งนี้แสดงรายการกระบวนการทั้งหมดที่มีหลายคอลัมน์ที่เกี่ยวข้องกับเวลา มันมีคอลัมน์ต่อไปนี้:

PID COMMAND                          STARTED     ELAPSED     TIME COMMAND

PID= ID กระบวนการ
แรกCOMMAND= เฉพาะชื่อคำสั่งที่ไม่มีตัวเลือกและไม่มีอาร์กิวเมนต์
STARTED= เวลาสัมบูรณ์ที่กระบวนการเริ่มต้น
ELAPSED= เวลาที่ผ่านไปตั้งแต่กระบวนการเริ่มต้น ( เวลานาฬิกาแขวนผนัง ), รูปแบบ [[dd-] hh:] mm: ss TIME= สะสม เวลา CPU, "[dd-] hh: mm: ss" format
second COMMAND= คำสั่งอีกครั้งคราวนี้พร้อมตัวเลือกและอาร์กิวเมนต์ที่ระบุทั้งหมด


1
ดี ฉันชอบetimesตัวเอง - เวลาที่ผ่านไปในไม่กี่วินาที - ดังนั้นมันจึงสามารถอ่านได้ด้วยเครื่อง
Asfand Qazi

1
คำถามเกี่ยวกับสถิติเวลาเป็นมิลลิวินาที
yohann.martineau

น่าเสียดายที่ busybox 1.29.3 ทำให้การจัดรูปแบบของอีไทม์แตกหักดังนั้นอย่าพึ่งพาการแยกวิเคราะห์
Danny Dulai

10

หากคุณมี จำกัด รุ่นpsเช่นที่พบในคุณจะได้รับเวลาเริ่มต้นกระบวนการที่กำลังมองหาที่ประทับเวลาของbusybox /proc/<PID>ตัวอย่างเช่นถ้า 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

ดูเหมือนว่าจะไม่ทำงานกับเมล็ดปัจจุบันอีกต่อไป
goertzenator

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

ใช่เก่าเกินไปและยังมีสิ่งที่ยากเกินไป ฉันลองใช้วิธี "stat" ที่เสนอข้างต้น แต่ถ้าฉันมี "touch" -ed PID proc dir เมื่อวาน? ซึ่งหมายความว่ากระบวนการปีเก่าของฉันแสดงพร้อมการประทับเวลาเมื่อวาน ไม่ไม่ใช่สิ่งที่ฉันต้องการ :(

ในรุ่นใหม่มันง่าย:

ps -o etimes -p <PID>
ELAPSED
339521

ง่ายเหมือนที่ เวลามีอยู่ในไม่กี่วินาที ทำสิ่งที่คุณต้องการ เมื่อใช้กล่องเก่า ๆ สถานการณ์จะยากขึ้นเนื่องจากไม่มีเวลา หนึ่งสามารถพึ่งพา:

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

นี้เป็นวิธีที่ดีจริงๆในการทำไว้ในระบบเก่าขอบคุณ :)
RobotJohnny

อย่าแยกเอาต์พุตของ etime เนื่องจาก busybox 1.29.3 เปลี่ยนรูปแบบ ใช้วิธี stat + / proc แทน
Danny Dulai

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

pidof java => id กระบวนการสำหรับกระบวนการ Java

etimes= => เวลาในวินาทีและ '=' คือการลบส่วนหัว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.