
top은 요약에 다음 숫자를 표시합니다.
작업: 총 193개, 실행 중 1개, 수면 192개, 정지 0개, 좀비 0개
나는 프로그램을 실행하고 /proc 파일을 구문 분석하는 등 다른 방법으로 이를 얻을 수 있는 방법을 찾고 있습니다.
그 숫자를 얻는 방법을 알고 있나요?
내가 얻을 수 있었던 가장 가까운 것은 다음과 같습니다.
pgrep "" -c
192
그리고 top & pgrep:
top -b -n 1 | head -n 2 | tail -n 1; pgrep "" -c
절대 동의하지 마세요...
예: 194 대 191
grep 'procs' /proc/stat
procs_running 2
procs_blocked 0
그리고 여기에는 달리고, 자고, 멈추고, 좀비에 대한 언급이 있습니다. http://procps.cvs.sourceforge.net/viewvc/procps/procps/top.c?revision=1.134&view=markup#l1025
이 grep은 일치하는 항목을 찾았으며 잠자는 것은 192입니다.
grep -R sleeping /proc/*/status | wc -l
하지만 수면을 수행하는 방식과 pgrep의 총 수행 방식은 합산되지 않습니다.
top -b -n 1 | head -n 2 | tail -n 1; pgrep "" -c; grep "procs" /proc/stat; grep -R sleeping /proc/*/status | wc -l
답변1
ps -eo stat | awk '/^S/ { stat+=1 } /^R/ { run +=1 } /^Z/ { zomb+=1 } { tot+=1 } END { print "sleeping = "stat" Running = "run" Zombie = "zomb" total = "tot }'
그러면 프로세스 상태 정보에 대한 동일한 정보가 제공됩니다.
R은 프로세스를 실행하고, S는 휴면 프로세스, Z는 좀비입니다.
top은 실제 실행 중인 프로세스를 고려하므로 항상 하나의 실행 중인 프로세스를 더 표시한다는 점을 명심하세요.
답변2
몇 가지 예외를 제외하고 ps는 정답을 반환합니다.
local output=$(ps axo stat=)
cpu_tasks_running=$(echo -e "${output}" | grep -c '^R')
cpu_tasks_sleeping=$(grep sleeping /proc/*/status | wc -l)
# searching /proc gets better results than searching ps output:
# cpu_tasks_sleeping=$(echo -e "${output}" | grep -cE '^D|^S')
cpu_tasks_stopped=$(echo -e "${output}" | grep -ci '^T')
cpu_tasks_zombie=$(echo -e "${output}" | grep -c '^Z')
cpu_tasks_total=$(($cpu_tasks_running + $cpu_tasks_sleeping))
# counting ps total lines never matched ps running + ps sleeping, nor top
# replaced with math: ps running + ps sleeping
# cpu_tasks_total=$(echo -e "${output}" | wc -l)