Có được thời gian người dùng và kernel của một tiến trình đang chạy?


7

Có cách nào để xác định sử dụng các công cụ Linux / Unix tiêu chuẩn một quá trình đã chi trong chế độ Người dùng và bao nhiêu chờ đợi kernel?

Nói cách khác, chính xác các giá trị "người dùng" và "sys" mà bạn nhận được khi sử dụng time, nhưng trong quá trình chạy?

LƯU Ý: một cách là sử dụng WBEM và liệt kê Linux_UnixProcess, nhưng tôi cần sử dụng công cụ khác ngoài công cụ này; Mục đích của tôi là xác minh những gì nhà cung cấp WBEM nói với tôi, tức là tôi cần sử dụng các công cụ khác nhau.


Xem times(2)timesdựng sẵn vỏ của bạn. Các timetừ khóa của một số vỏ khi bởi chính nó cũng hiển thị thời gian.
Stéphane Chazelas

@StephaneChazelas thật không may, tôi cần đọc thời gian cho mỗi quy trình, trong khi và các cuộc gọi này cung cấp thời gian tích lũy từ vỏ và trẻ em.
Alois Mahdal

Không timesđưa ra cả thời gian của quá trình và thời gian của trẻ em (đã chết và chờ đợi).
Stéphane Chazelas

Câu trả lời:


13

Trên Linux, thông tin có sẵn trong các trường từ 14 đến 17 của /proc/$pid/stat(xem Proc (5) để biết chi tiết):

Các lĩnh vực là:

  • 14: thời gian của người dùng (về số lần bấm đồng hồ)
  • 15: thời gian hệ thống
  • 16: thời gian chờ đợi của trẻ em
  • 17: Thời gian chờ đợi của trẻ em

(tất cả các luồng của một quy trình nhất định có cùng giá trị ở đó)

Họ không được báo cáo trực tiếp bởi ps.

psbáo cáo 14 + 15 với ps -o time14 + 15 + 16 + 17với ps --cumulative -o bsdtime.

Xin lưu ý rằng trường thứ hai trong /proc/$pid/statcó thể chứa khoảng trắng hoặc ký tự dòng mới, vì vậy bạn không thể phân tích cú pháp bằng awk $1, $2...

Bạn có thể sử dụng perlnhư:

$ perl -MPOSIX -l -0777 -ne '@f = /\(.*\)|\S+/gs;
    printf "utime: %.2f\nstime: %.2f\ncutime: %.2f\ncstime: %.2f\n",
      map {$_/POSIX::sysconf( &POSIX::_SC_CLK_TCK )}@f[13..16]' "/proc/$pid/stat"
utime: 3.79
stime: 2.06
cutime: 56.49
cstime: 34.27

Một quá trình có thể lấy lại thời gian của riêng nó với getrusage(RUSAGE_SELF)getrusage(RUSAGE_CHILDREN).

Ngoài ra còn có một timescuộc gọi hệ thống lấy thông tin tương tự. Vỏ POSIX có tích hợp timessẵn cho điều đó. Một số shell cũng cung cấp thông tin đó với time(không có đối số).

$ times
0m3.800s 0m2.060s
0m56.512s 0m34.276s

$ ps -o time -p "$$"
    TIME
00:00:05
$ ps --cumulative -o bsdtime -p "$$"
  TIME
  1:36

Bash timesA) không cho phép tôi xem thời gian riêng biệt cho mỗi đứa trẻ và B) dường như chỉ báo cáo thời gian từ những đứa trẻ đã bị chấm dứt. Tôi đã giải quyết A bằng cách gói mỗi đứa trẻ bằng một tập lệnh bash gọi con và sau đó chỉ báo cáo lần, nhưng vẫn; do B, có khoảng cách cần thiết tối đa: 1. đo bằng WBEM, 2. kill, 3. đọc báo cáo.
Alois Mahdal

Điều gì về việc truy xuất thời gian của người dùng / hệ thống cho một luồng? Đó là một vấn đề tôi hiện đang cần giải quyết (mà không vượt qua RUSAGE_THREAD - đặc trưng của Linux) để gây khó chịu.
Alec Teal
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.