จัดรูปแบบเอาต์พุตของ cputime สำหรับ ps


13

ฉันพยายามเขียนสคริปต์ที่สามารถตรวจสอบการใช้งาน CPU ของกระบวนการในช่วงเวลาหนึ่ง (เพื่อสร้างกราฟ)

จนถึงตอนนี้เป็นคำสั่งที่ฉันใช้

ps -p $PROCID -o cputime,etimes

ข้อกังวลเดียวของฉันคือผลลัพธ์ของ cputime ดูเหมือนจะเป็น[dd]hh:mm(หรือสิ่งที่คล้ายกันไม่สามารถจำด้านบนของหัวของฉันตอนนี้)

มีวิธีการจัดรูปแบบ cputime ในไม่กี่วินาทีเช่น etime -> etimes เพื่อให้ได้เวลาที่ผ่านไปในไม่กี่วินาที?

แก้ไข: นี่คือผลลัพธ์ที่ฉันได้รับในขณะนี้

2-03:01:33 2653793

ฉันต้องการพารามิเตอร์แรกที่จัดรูปแบบเป็นวินาทีไม่ใช่วันชั่วโมง: นาที: วินาที


คุณช่วยเพิ่มผลผลิตที่คุณได้รับตอนนี้และเอาท์พุทที่คุณต้องการรับได้ไหม
Simply_Me

@Simply_Me ฉันได้แก้ไขโพสต์
dreadiscool

@ John1024 ใช่มันคือจำนวนวัน
dreadiscool

คำตอบ:


9

สิ่งนี้จะแปลงเป็นครั้งแรกเป็นวินาที:

ps -p $PROCID -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'

ตัวอย่างเช่นคำสั่ง ps สร้าง:

$ ps -p 5403 -o cputime,etimes
    TIME ELAPSED
01:33:38 1128931

awkคำสั่งประมวลผลที่และผลตอบแทน:

ps -p 5403 -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'
5618 1128931

คำอธิบาย

  • -F'[: ]+'

    สิ่งนี้บอกให้ awk ปฏิบัติต่อทั้งโคลอนและช่องว่างเป็นตัวคั่นฟิลด์ วิธีนี้ชั่วโมงนาทีและวินาทีจะปรากฏเป็นฟิลด์แยก

  • /:/ {t=$3+60*($2+60*$1); print t,$NF}

    เริ่มต้น/:/จำกัด รหัสให้ทำงานบนบรรทัดที่มีเครื่องหมายโคลอนเท่านั้น สิ่งนี้จะลบบรรทัดส่วนหัว t=$3+60*($2+60*$1)จำนวนวินาทีที่คำนวณจากชั่วโมงนาทีวินาทีผ่าน ค่าผลลัพธ์สำหรับtจะถูกพิมพ์พร้อมกับเวลาที่ผ่านไป

จัดการวัน

หากpsสร้างวัน, ชั่วโมง, นาที, วินาทีเช่นเดียวกับใน:

2-03:01:33

จากนั้นใช้รหัสนี้แทน:

ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ {t=$4+60*($3+60*($2+24*$1)); print t,$NF}'

หากจำนวนวันอาจจะใช่หรือไม่อาจนำไปรวมกับเอาต์พุตให้ใช้คำสั่งชุดค่าผสมนี้:

ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ && NF==5 { t=$4+60*($3+60*($2+24*$1)); print t,$NF} /:/ && NF==4 {t=$3+60*($2+60*$1); print t,$NF}'

ยกโทษให้ฉันถ้าฉันเข้าใจผิด แต่ดูเหมือนว่าคำสั่งนี้จะไม่คำนึงถึงวันซึ่งสามารถเตรียมได้
dreadiscool

ถูกต้อง: ระบบของฉันไม่แสดงจำนวนวันสำหรับกระบวนการใด ๆ ฉันเดาได้ว่าวันนี้จะมีลักษณะเป็นอย่างไร แต่คุณสามารถให้ตัวอย่างจริงได้ไหม
John1024

2-03: 01: 33 คือ 2 วัน 3 ชั่วโมง 1 นาทีและ 33 วินาที วันไม่ได้รับการเตรียมพร้อมล่วงหน้าเสมอ ในระบบของฉันจะมีการเสริมล่วงหน้าหากกระบวนการยังมีชีวิตอยู่นานกว่า 24 ชั่วโมง ขอบคุณสำหรับความช่วยเหลือของคุณจนถึงตอนนี้ฉันขอขอบคุณ
dreadiscool

@ user1772510 คำตอบอัพเดทเพื่อจัดการกับวัน
John1024

ขอบคุณสำหรับความช่วยเหลือของคุณทั้งหมดถ้าฉันสามารถ upvote ฉัน upvote เช่นกัน (ตัวแทนไม่เพียงพอในชุมชนนี้) ฉันขอบคุณมันอย่างลึกซึ้ง!
dreadiscool

2

หากคุณไม่ต้องการนำ awk ในเกมโซลูชันทุบตีบริสุทธิ์ (t_str มีสตริงที่จัดรูปแบบแล้ว t_sec เวลาถอดรหัสเป็นวินาที):

# Decode the CPU time format [dd-]hh:mm:ss.
IFS="-:" read c1 c2 c3 c4 <<< "$t_str"
if [ -n "$c4" ]
then
  t_sec=$((10#$c4+60*(10#$c3+60*(10#$c2+24*10#$c1))))
else
  t_sec=$((10#$c3+60*(10#$c2+60*10#$c1)))
fi

0

คุณไม่ได้ระบุระบบปฏิบัติการที่ใช้ หากเป็น Linux และเนื่องจากคุณสนใจที่จะตรวจสอบกระบวนการเฉพาะคุณอาจพบว่าการแยกวิเคราะห์ได้คุ้มค่ายิ่งขึ้น/proc/$PROCID/stat- ดูproc(5)หน้าคู่มือสำหรับรายละเอียด

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