top을 사용하지 않고 top이 제공하는 시스템 작업 요약을 얻는 방법은 무엇입니까?

top을 사용하지 않고 top이 제공하는 시스템 작업 요약을 얻는 방법은 무엇입니까?

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)

관련 정보