Apakah ada cara untuk menentukan dengan menggunakan alat Linux/Unix standar berapa banyak proses yang telah dihabiskan dalam mode Pengguna dan berapa lama menunggu kernel?
Dengan kata lain, persisnya nilai “user” dan “sys” yang Anda dapatkan saat menggunakan time
, tetapi selama proses runtime?
CATATAN: salah satu caranya adalah dengan menggunakan WBEM dan menghitung Linux_UnixProcess, tetapi saya perlu menggunakan lainnya alat dari ini; tujuan saya adalah untuk memverifikasi apa yang dikatakan penyedia WBEM kepada saya, yaitu saya perlu menggunakan alat yang berbeda.
Jawaban yang Diterima:
Di Linux, info tersedia di kolom 14 hingga 17 dari /proc/$pid/stat
(lihat proc(5) untuk detailnya):
Bidangnya adalah:
- 14:waktu pengguna (dalam jumlah detak jam)
- 15:waktu sistem
- 16:waktu pengguna menunggu anak
- 17:sistem waktu menunggu anak
(semua utas dari proses yang diberikan memiliki nilai yang sama di sana)
Mereka tidak langsung dilaporkan oleh ps
.
ps
melaporkan 14 + 15 dengan ps -o time
dan 14 + 15 + 16 + 17
dengan ps --cumulative -o bsdtime
.
Hati-hati bahwa kolom kedua di /proc/$pid/stat
mungkin berisi spasi atau karakter baris baru, jadi Anda tidak dapat menguraikannya dengan $1
awk , $2
…
Anda dapat menggunakan perl
seperti:
$ perl -MPOSIX -l -0777 -ne '@f = /(.*)|S+/gs;
printf "utime: %.2fnstime: %.2fncutime: %.2fncstime: %.2fn",
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
Sebuah proses dapat mengambil waktunya sendiri dengan getrusage(RUSAGE_SELF)
dan getrusage(RUSAGE_CHILDREN)
.
Ada juga times
panggilan sistem yang mengambil informasi yang sama. Shell POSIX memiliki times
bawaan untuk itu. Beberapa shell juga menyediakan informasi tersebut dengan time
(tanpa argumen).
$ 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