ฉันต้องการหลีกเลี่ยงการทำสิ่งนี้ด้วยการเปิดตัวกระบวนการจากแอพตรวจสอบ
ฉันต้องการหลีกเลี่ยงการทำสิ่งนี้ด้วยการเปิดตัวกระบวนการจากแอพตรวจสอบ
คำตอบ:
บน 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 จะรบกวนความแม่นยำ
=
ไม่ใส่ส่วนหัว ลองโดยไม่ลองหรือลองps -p $$ -o etime="Silly Header Here"
etimes
ตัวเองมากกว่าเพราะมันสามารถอ่านได้ด้วยเครื่อง
sysconf()
และทำให้คุณมีค่าฮาร์ดโค้ดจากไลบรารี C ตามที่ระบุไว้ใช่ไหม
พกพา:
% 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
)
sysinfo.c
แพคเกจ procps หนึ่งสามารถก) รวมไฟล์ส่วนหัวเคอร์เนล (และคอมไพล์ใหม่หากใช้เคอร์เนลที่แตกต่างกันข) ใช้ฟังก์ชั่น posix sysconf () ซึ่งน่าเศร้าใช้ค่าฮาร์ดโค้ดที่รวบรวมไว้ใน ไลบรารี c หรือ c) ถามเคอร์เนลและไม่มีส่วนต่อประสานอย่างเป็นทางการในการทำเช่นนั้น ดังนั้นรหัสรวมถึงชุดของ kludges ที่จะกำหนดค่าที่ถูกต้อง ว้าว.
ps
รัฐ manpage ว่าtime
คือ "เวลา CPU สะสม" ฉันคิดว่าสิ่งที่ OP กำลังมองหาคือetime
หรือ "เวลาที่ผ่านไปตั้งแต่กระบวนการเริ่มต้น" pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html
etime
แม้ว่า
ps -eo pid,comm,cmd,start,etime | grep -i X
X คือชื่อของกระบวนการ
ps -o pid,comm,cmd,start,etime -p X
เพื่อดู PID X.
ps
ใช้ตัวเลือกในการระบุรูปแบบการส่งออกและเป็นหนึ่งในคอลัมน์ที่มีอยู่คือ-o
etime
ตามหน้าคน:
เวลาที่ผ่านไปนับตั้งแต่กระบวนการเริ่มต้นในรูปแบบ [[dd-] hh:] mm: ss
ดังนั้นคุณสามารถเรียกใช้สิ่งนี้เพื่อรับ PID และเวลาที่ผ่านไปของทุกกระบวนการ:
$ ps -eo pid,etime
หากคุณต้องการเวลาที่ผ่านไปของ PID ที่เฉพาะเจาะจง (เช่น 12345) คุณสามารถทำสิ่งต่อไปนี้:
$ ps -eo pid,etime | awk '/^12345/ {print $2}'
( แก้ไข : ปรากฎว่ามีไวยากรณ์สั้นกว่าสำหรับคำสั่งข้างต้นดูคำตอบของ mattdm )
ไม่แน่ใจว่าทำไมยังไม่ได้รับการแนะนำ: บน Linuxคุณสามารถstat()
ไดเรกทอรี / proc / [nnn] สำหรับ PID ของคุณ
พฤติกรรมนี้ได้รับการออกแบบมาอย่างชัดเจนเพื่อคืนเวลาเริ่มต้นของกระบวนการซึ่งสามารถทำได้ที่ความละเอียดสูงและเคอร์เนลสามารถทำได้อย่างถูกต้องโดยไม่ต้องแฮ็กแฮ็กเนื่องจากแฮ็กเคอร์เนลสามารถ (ชัด) เพียงตรวจสอบข้อมูลที่เกี่ยวข้อง ฟิลด์การเข้าถึงการปรับเปลี่ยนข้อมูลและการเปลี่ยนสถานะจะส่งคืนเวลาเริ่มต้นกระบวนการ
เหนือสิ่งอื่นใดคุณสามารถใช้stat(1)
ที่เชลล์หรือการเชื่อมโยงที่เหมาะสมstat(2)
จาก $ Favorite_programming_language ดังนั้นคุณอาจไม่จำเป็นต้องเปิดใช้กระบวนการภายนอก
โปรดทราบว่าสิ่งนี้ไม่สามารถใช้ได้กับ/usr/compat/linux/proc
FreeBSD; เวลาการเข้าถึง / การดัดแปลง / การเปลี่ยนสถานะที่ส่งคืนเป็นเวลาปัจจุบันและเวลาเกิดเป็นยุคของ UNIX การสนับสนุนค่อนข้างงี่เง่าไม่ได้อยู่ที่นั่นถ้าคุณถามฉัน
stat /proc/4480
สิ่งนี้จะให้วันเดือนปีเกิดเปลี่ยนแก้ไขและเข้าใช้งานของกระบวนการ หากคุณต้องการ ID กระบวนการเพียงใช้ "top"
หากคุณสามารถรันเวลาแล้วรันคำสั่งคุณจะได้รับสิ่งที่คุณกำลังมองหา คุณไม่สามารถทำเช่นนี้กับคำสั่งที่ทำงานอยู่แล้ว
[0] เวลานอนหลับ 20%
sleep 20 0.00s ผู้ใช้ 0.00s ระบบ 0% cpu รวม 20.014
คุณสามารถรับเวลาเริ่มต้นของกระบวนการโดยดูstat
จากไฟล์สถิติที่จัดทำโดยจัดproc
รูปแบบโดยใช้date
และลบออกจากเวลาปัจจุบัน:
echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))
13494
pid กระบวนการของคุณอยู่ที่ไหน
$ 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 เป็นรหัสกระบวนการ
เวลาที่ผ่านไปในไม่กี่วินาที: expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)
date +%s --date="now - $( stat -c%X /proc/$$
etime=
ตัวพิมพ์หรือไม่ ฉันสามารถค้นหาได้เฉพาะetime
ในหน้าคน