Định dạng đầu ra của cputime cho ps


12

Tôi đang cố gắng viết một tập lệnh có thể theo dõi việc sử dụng CPU của một quá trình trong một khoảng thời gian (để tạo một biểu đồ).

Cho đến nay, đây là lệnh tôi đang sử dụng

ps -p $PROCID -o cputime,etimes

Mối quan tâm duy nhất của tôi là đầu ra của cputime dường như là [dd]hh:mm(hoặc một cái gì đó tương tự, không thể nhớ ra khỏi đỉnh đầu của tôi bây giờ)

Có cách nào để định dạng cputime tính bằng giây, giống như etime -> etimes để có thời gian trôi qua tính bằng giây?

Chỉnh sửa: Đây là đầu ra mà tôi hiện đang nhận được

2-03:01:33 2653793

Tôi muốn tham số đầu tiên được định dạng sau vài giây, không phải ngày-giờ: phút: giây.


bạn có thể vui lòng thêm đầu ra bạn nhận được bây giờ và đầu ra bạn muốn nhận không?
Simply_Me

@Simply_Me Tôi đã chỉnh sửa bài đăng
dreadiscool

@ John1024 Vâng, đó là, đó là số ngày.
dreadiscool

Câu trả lời:


9

Điều này chuyển đổi lần đầu tiên thành giây:

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

Ví dụ, lệnh ps tạo ra:

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

Các awklệnh xử lý đó và lợi nhuận:

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

Giải trình

  • -F'[: ]+'

    Điều này nói với awk để coi cả dấu hai chấm và dấu cách là dấu phân cách trường. Bằng cách này, giờ, phút và giây xuất hiện dưới dạng các trường riêng biệt.

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

    Ban đầu /:/hạn chế mã chỉ hoạt động trên các dòng có dấu hai chấm. Điều này loại bỏ các dòng tiêu đề. Số giây được tính từ giờ, phút, giây qua t=$3+60*($2+60*$1). Giá trị kết quả tsau đó được in cùng với thời gian đã trôi qua.

Ngày xử lý

Nếu pstạo ra ngày, giờ, phút, giây, như trong:

2-03:01:33

Sau đó, sử dụng mã này thay thế:

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

Nếu ngày có thể hoặc không được thêm vào đầu ra, thì hãy sử dụng lệnh kết hợp này:

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}'

Hãy tha thứ cho tôi nếu tôi nhầm, nhưng có vẻ như lệnh này không được tính đến ngày, cũng có thể được chuẩn bị trước
dreadiscool

Đó là chính xác: hệ thống của tôi đã không hiển thị ngày cho bất kỳ quá trình. Tôi có thể đoán những ngày có thể trông như thế nào, nhưng bạn có thể cung cấp một ví dụ thực tế không?
John1024

2-03: 01: 33 là 2 ngày, 3 giờ, 1 phút và 33 giây. Ngày không phải lúc nào cũng được chuẩn bị trước. Trên hệ thống của tôi, nó chỉ được chuẩn bị trước nếu quá trình này tồn tại hơn 24 giờ. Cảm ơn sự giúp đỡ của bạn cho đến nay btw, tôi đánh giá cao nó
dreadiscool

@ user1772510 Trả lời cập nhật để xử lý ngày.
John1024

Cảm ơn tất cả sự giúp đỡ của bạn, nếu tôi có thể nâng cao tôi cũng sẽ nâng cao (không đủ đại diện trong cộng đồng này) tôi đánh giá cao điều đó!
dreadiscool

2

Nếu bạn không muốn mang awk vào trò chơi, một giải pháp bash thuần túy (t_str chứa chuỗi được định dạng, t_sec thời gian giải mã tính bằng giây):

# 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

Bạn không chỉ định hệ điều hành này là dành cho; nếu đó là Linux và được cho rằng bạn quan tâm đến việc theo dõi một quy trình cụ thể, bạn có thể thấy nó đáng để phân tích hơn /proc/$PROCID/stat- xem proc(5)trang hướng dẫn để biết chi tiết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.