จะตรวจสอบว่ากระบวนการทำงานนานแค่ไหน?


243

ฉันต้องการหลีกเลี่ยงการทำสิ่งนี้ด้วยการเปิดตัวกระบวนการจากแอพตรวจสอบ

คำตอบ:


311

บน Linux ด้วยpsจากprocps(-ng)(และระบบส่วนใหญ่ตั้งแต่นี้จะถูกระบุโดย POSIX):

ps -o etime= -p "$$" 

ที่ไหน$$เป็น PID ของกระบวนการที่คุณต้องการตรวจสอบ [[dd-]hh:]mm:ssนี้จะกลับเวลาที่ผ่านไปในรูปแบบ

การใช้-o etimeบอกpsว่าคุณต้องการเขตข้อมูลเวลาที่ผ่านไปและ=ในตอนท้ายของการระงับส่วนหัว (โดยไม่ต้องคุณจะได้รับบรรทัดที่พูดELAPSEDแล้วเวลาในบรรทัดถัดไปด้วยคุณจะได้รับเพียงหนึ่งบรรทัดกับเวลา) .

หรือด้วยชุดเครื่องมือ procps-ng รุ่นใหม่ (3.3.0 ขึ้นไป) บน Linux หรือบน FreeBSD 9.0 หรือสูงกว่า (และอื่น ๆ ที่เป็นไปได้) ให้ใช้:

ps -o etimes= -p "$$"

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

บน Linux psโปรแกรมจะรับสิ่งนี้จาก/proc/$$/statที่หนึ่งในฟิลด์ (ดูman proc) คือเวลาเริ่มต้นกระบวนการ นี่คือโชคไม่ดีที่ระบุว่าเป็นเวลาในระยะเวลาอันสั้น (ตัวนับเวลาโดยพลการที่ใช้ในเคอร์เนล Linux) ตั้งแต่เริ่มระบบ ดังนั้นคุณต้องกำหนดเวลาที่ระบบทำการบูท (จาก/proc/stat) จำนวน jiffies ต่อวินาทีในระบบนี้จากนั้นทำการคำนวณทางคณิตศาสตร์เพื่อให้ได้เวลาที่ผ่านไปในรูปแบบที่มีประโยชน์

มันกลายเป็นความซับซ้อนที่น่าขันเพื่อค้นหาค่าของ HZ (นั่นคือ jiffies ต่อวินาที) จากความคิดเห็นในsysinfo.cแพ็คเกจ procps หนึ่งสามารถ A) รวมไฟล์ส่วนหัวเคอร์เนลและ recompile หากใช้เคอร์เนลที่แตกต่างกัน B) ใช้sysconf()ฟังก์ชั่นposix ซึ่งน่าเศร้าใช้ค่าฮาร์ดโค้ดที่รวบรวมลงในห้องสมุด C หรือ C) ถามเคอร์เนล แต่ไม่มีอินเทอร์เฟซอย่างเป็นทางการในการทำเช่นนั้น ดังนั้นpsรหัสรวมถึงชุดของ kludges ที่จะกำหนดค่าที่ถูกต้อง ว้าว.

ดังนั้นมันจึงสะดวกpsสำหรับคุณ :)

ในฐานะผู้ใช้ @ 336_ บันทึกย่อบน Linux (นี่ไม่ใช่แบบพกพา) คุณสามารถใช้statคำสั่งเพื่อดูวันที่เข้าถึงแก้ไขหรือเปลี่ยนสถานะของไดเรกทอรี/proc/$$(ซึ่ง$$เป็นกระบวนการที่น่าสนใจอีกครั้ง) ตัวเลขทั้งสามควรเหมือนกันดังนั้น

stat -c%X /proc/$$

จะให้เวลาที่กระบวนการ$$เริ่มต้นในไม่กี่วินาทีนับตั้งแต่ยุค นั่นยังคงไม่ใช่สิ่งที่คุณต้องการเนื่องจากคุณยังคงต้องทำคณิตศาสตร์เพื่อลบมันออกจากเวลาปัจจุบันเพื่อให้ได้เวลาที่ผ่านไป - ฉันคิดว่าสิ่งที่ต้องการdate +%s --date="now - $( stat -c%X /proc/$$ ) seconds"จะใช้งานได้ ข้อดีอย่างหนึ่งที่เป็นไปได้คือถ้าคุณใช้เอาต์พุตแบบยาวเช่น-c%xแทนคุณ-c%Xจะได้รับความละเอียดมากกว่าวินาทีจำนวนเต็ม แต่ถ้าคุณต้องการคุณควรใช้วิธีการตรวจสอบกระบวนการเพราะเวลาของการรันคำสั่ง stat จะรบกวนความแม่นยำ


1
Hi! เป็นetime=ตัวพิมพ์หรือไม่ ฉันสามารถค้นหาได้เฉพาะetimeในหน้าคน
Kent Pawar

16
@KentPawar มันไม่ใช่การพิมพ์ผิด ที่ว่างเปล่า=ไม่ใส่ส่วนหัว ลองโดยไม่ลองหรือลองps -p $$ -o etime="Silly Header Here"
mattdm

4
ps -p $ (ค้นหา pgrep) -o etime =
mafrosis

1
ดี ฉันชอบetimesตัวเองมากกว่าเพราะมันสามารถอ่านได้ด้วยเครื่อง
Asfand Qazi

1
@alexmurray นั่นเป็นเพียงการโทรsysconf()และทำให้คุณมีค่าฮาร์ดโค้ดจากไลบรารี C ตามที่ระบุไว้ใช่ไหม
mattdm

36

พกพา:

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

นั่นคือเชลล์นั้นเริ่มเมื่อวันที่ 30 มกราคมและรวมเวลา CPU ประมาณ 6 วินาที

อาจมีวิธีที่แม่นยำหรือแยกวิเคราะห์ได้มากกว่า แต่วิธีพกพาน้อยกว่าเพื่อรับข้อมูลนี้ ตรวจสอบเอกสารของpsคำสั่งหรือprocระบบไฟล์ของคุณ

ภายใต้ Linux /proc/$pid/statข้อมูลนี้อาศัยอยู่ใน

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

เวลา CPU อยู่ในระยะเวลาอันสั้น ฉันไม่รู้วิธีการค้นหาค่า jiffy จากเชลล์อย่างฉับพลัน เวลาเริ่มต้นสัมพันธ์กับเวลาบูต (พบใน/proc/uptime)


3
การหาค่าของ HZ (นั่นคือ jiffies ต่อวินาที) กลายเป็นเรื่องที่ซับซ้อนอย่างน่าขัน! จากความคิดเห็นในsysinfo.cแพคเกจ procps หนึ่งสามารถก) รวมไฟล์ส่วนหัวเคอร์เนล (และคอมไพล์ใหม่หากใช้เคอร์เนลที่แตกต่างกันข) ใช้ฟังก์ชั่น posix sysconf () ซึ่งน่าเศร้าใช้ค่าฮาร์ดโค้ดที่รวบรวมไว้ใน ไลบรารี c หรือ c) ถามเคอร์เนลและไม่มีส่วนต่อประสานอย่างเป็นทางการในการทำเช่นนั้น ดังนั้นรหัสรวมถึงชุดของ kludges ที่จะกำหนดค่าที่ถูกต้อง ว้าว.
mattdm

1
psรัฐ manpage ว่าtimeคือ "เวลา CPU สะสม" ฉันคิดว่าสิ่งที่ OP กำลังมองหาคือetimeหรือ "เวลาที่ผ่านไปตั้งแต่กระบวนการเริ่มต้น" pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html
rinogo

1
ไม่ใช่ "พกพา" หลังจากทั้งหมด: "ps: stime: ไม่พบคำหลัก"ใน FreeBSD อย่างน้อยก็สนับสนุนetimeแม้ว่า
n.st


13

psใช้ตัวเลือกในการระบุรูปแบบการส่งออกและเป็นหนึ่งในคอลัมน์ที่มีอยู่คือ-o etimeตามหน้าคน:

เวลาที่ผ่านไปนับตั้งแต่กระบวนการเริ่มต้นในรูปแบบ [[dd-] hh:] mm: ss

ดังนั้นคุณสามารถเรียกใช้สิ่งนี้เพื่อรับ PID และเวลาที่ผ่านไปของทุกกระบวนการ:

$ ps -eo pid,etime

หากคุณต้องการเวลาที่ผ่านไปของ PID ที่เฉพาะเจาะจง (เช่น 12345) คุณสามารถทำสิ่งต่อไปนี้:

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

( แก้ไข : ปรากฎว่ามีไวยากรณ์สั้นกว่าสำหรับคำสั่งข้างต้นดูคำตอบของ mattdm )


5

ไม่แน่ใจว่าทำไมยังไม่ได้รับการแนะนำ: บน Linuxคุณสามารถstat()ไดเรกทอรี / proc / [nnn] สำหรับ PID ของคุณ

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

เหนือสิ่งอื่นใดคุณสามารถใช้stat(1)ที่เชลล์หรือการเชื่อมโยงที่เหมาะสมstat(2)จาก $ Favorite_programming_language ดังนั้นคุณอาจไม่จำเป็นต้องเปิดใช้กระบวนการภายนอก

โปรดทราบว่าสิ่งนี้ไม่สามารถใช้ได้กับ/usr/compat/linux/procFreeBSD; เวลาการเข้าถึง / การดัดแปลง / การเปลี่ยนสถานะที่ส่งคืนเป็นเวลาปัจจุบันและเวลาเกิดเป็นยุคของ UNIX การสนับสนุนค่อนข้างงี่เง่าไม่ได้อยู่ที่นั่นถ้าคุณถามฉัน


ฉันจะดูข้อมูลได้ที่ไหน ฉันเห็นเฉพาะการเข้าถึงแก้ไขและเปลี่ยนแปลงเท่านั้น
tshepang

@Tshepang โปรดทราบว่าค่าเหล่านั้นเหมือนกันทั้งหมดและเป็นเวลาเริ่มต้นกระบวนการ คุณยังต้องทำการคำนวณทางคณิตศาสตร์ แต่นี่ดีกว่าการพยายามหาระยะเวลาอันสั้นตามที่ระบุไว้ในคำตอบของฉัน
mattdm

คุณเรียกสิ่งนี้ว่า: stat /proc/4480สิ่งนี้จะให้วันเดือนปีเกิดเปลี่ยนแก้ไขและเข้าใช้งานของกระบวนการ หากคุณต้องการ ID กระบวนการเพียงใช้ "top"
user890332

2

หากคุณสามารถรันเวลาแล้วรันคำสั่งคุณจะได้รับสิ่งที่คุณกำลังมองหา คุณไม่สามารถทำเช่นนี้กับคำสั่งที่ทำงานอยู่แล้ว

[0] เวลานอนหลับ 20%

sleep 20 0.00s ผู้ใช้ 0.00s ระบบ 0% cpu รวม 20.014


คุณรู้ว่าฉันจะทำในการตรวจสอบกระบวนการทำงานจนกว่าจะสิ้นสุดหรือไม่
lrkwz

1

คุณสามารถรับเวลาเริ่มต้นของกระบวนการโดยดูstatจากไฟล์สถิติที่จัดทำโดยจัดprocรูปแบบโดยใช้dateและลบออกจากเวลาปัจจุบัน:

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

13494pid กระบวนการของคุณอยู่ที่ไหน


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 อาจเป็นปัญหามันลื่น
slm

1

เวลาที่ผ่านไปในไม่กี่วินาที: expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)


นี้ดูเหมือนว่าฉันจะเป็นรูปแบบที่แตกต่างกันเล็กน้อยของmattdm ที่กล่าวถึงแล้ว : date +%s --date="now - $( stat -c%X /proc/$$
Jeff Schaller

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