Existuje způsob, jak pomocí standardních nástrojů Linux/Unix určit, kolik proces strávil v uživatelském režimu a kolik čekání na jádro?
Jinými slovy, přesně ty hodnoty „user“ a „sys“, které získáte při použití time
, ale během běh procesu?
POZNÁMKA: jeden způsob je použít WBEM a vyjmenovat Linux_UnixProcess, ale musím použít other nástroj než tento; mým cílem je ověřit, co mi říká poskytovatel WBEM, tj. musím použít jiný nástroj.
Přijatá odpověď:
V systému Linux jsou informace dostupné v polích 14 až 17 v /proc/$pid/stat
(podrobnosti viz proc(5)):
Pole jsou:
- 14:uživatelský čas (v počtu hodin hodin)
- 15:sys time
- 16:uživatelská doba čekání na děti
- 17:sys čas čekání na děti
(všechna vlákna daného procesu tam mají stejné hodnoty)
Nejsou přímo hlášeny ps
.
ps
hlásí 14 + 15 s ps -o time
a 14 + 15 + 16 + 17
s ps --cumulative -o bsdtime
.
Pozor, druhé pole v /proc/$pid/stat
může obsahovat mezery nebo znaky nového řádku, takže je nemůžete analyzovat pomocí $1
awk , $2
…
Můžete použít perl
jako:
$ 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
Proces může získat své vlastní časy pomocí getrusage(RUSAGE_SELF)
a getrusage(RUSAGE_CHILDREN)
.
Je zde také times
systémové volání, které načte stejné informace. Shelly POSIX mají times
vestavěný pro to. Některé shelly také poskytují tyto informace s time
(bez argumentů).
$ 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