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은 일치하는 항목을 찾았으며 Sleeping은 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은 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)