프로세스가 장기간 동안 CPU를 100% 사용하고 있는지 감지하고 경고하는 방법은 무엇입니까?

프로세스가 장기간 동안 CPU를 100% 사용하고 있는지 감지하고 경고하는 방법은 무엇입니까?

가끔(며칠마다) 특정 프로세스가 CPU를 100% 사용하고 있는 것을 발견합니다. 이 프로세스는 avrdudeArduino IDE에 의해 시작되는데 어떤 경우에는 재현할 수 없으며 그림과 같이 CPU 사용률이 100%에 불과합니다 top.

Arduino 보드에 대한 업로드가 시작되었고 이 프로세스 중에 보드 연결이 끊어졌을 가능성이 있습니다.

내 프로세서에는 8개의 코어가 있으므로 코어 중 하나가 꽉 찼는지 즉시 알 수 없습니다. 실제로 이러한 현상은 연속해서 몇 번 발생하고 CPU 사용률이 100%인 코어가 3개 있을 때만 눈에 띄게 됩니다.

일부 백그라운드 작업에서 이를 확인하고(예: 15분마다) 나에게 알림을 보내는 방법(예: 팝업 대화 상자)이 있습니까? 우분투 14.04 LTS를 사용하고 있습니다.


답변을 주신 MelBurslan에게 감사드립니다. 그런데 왜 완전히 작동하지 않는지 혼란스럽습니다. 내 현재 스크립트는 다음과 같습니다.

cpupercentthreshold=2
pstring=""
top -b -n 1 | sed -e "1,7d" | while read line; do
cpuutil=$(echo ${line} | awk '{print $9}' | cut -d"." -f 1)
procname=$(echo ${line} | awk '{print $12}' )
if [ ${cpuutil} -ge ${cpupercentthreshold} ]
then
  echo ${cpuutil}
  pstring=${pstring}${procname}" "
  echo pstring is currently ${pstring}
fi
done
echo pstring is ${pstring}
if [ -n "${pstring}" ]
then
  zenity --title="Warning!" --question --text="These processes are above CPU threshold limit ${pstring}" --ok-label="OK"
fi

테스트를 위해 기준을 낮췄습니다. 그러나 보시다시피 개별 프로세스를 수집하지만 볼 수 없는 이유로 pstring이 갑자기 비어 있기 때문에 최종 테스트(대화 상자 표시)가 실패합니다.

13
pstring is currently VirtualBox
6
pstring is currently VirtualBox Xorg
6
pstring is currently VirtualBox Xorg compiz
6
pstring is currently VirtualBox Xorg compiz ibus-engin+
6
pstring is currently VirtualBox Xorg compiz ibus-engin+ top
pstring is

답변1

MelBurslan의 답변과 다양한 의견을 읽은 후 나는 (그들의 제안에 영감을 받아) Lua 버전을 만들어 보기로 결정했습니다. 이 시간은루아 5.1.5- 최신 Lua에서는 작동하는지 잘 모르겠습니다.

일반적인 아이디어는 Lua popen(파이프 열기)를 사용하여 실행한 top다음 정규식(또는무늬, Lua에서 말했듯이). 그런 다음 일치하는 선(대부분)이 임계값 백분율을 초과하는지 여부를 고려하십시오. 이렇게 하면 테이블에 추가됩니다.

테이블이 비어 있지 않으면 zenity사용자에게 메시지를 표시하기 위해 호출됩니다. 개발 중에 발견한 몇 가지 "문제점"은 다음과 같습니다.

  • zenity에 60초의 시간 제한을 추가하여 해당 시간에 컴퓨터에서 자리를 비울 경우 경고 대화 상자가 나타나지 않습니다.
  • --display=:0.0실행시 표시화면이 보이도록 추가하였습니다 cron.
  • 나는 crontab에서 "15분마다" 테스트를 다음과 같이 단순화했습니다.

    */15 * * * * /home/nick/check_cpu_usage.lua
    
  • top다른 테스트를 수행하려는 경우(예: 너무 많은 메모리 사용) 정규식은 모든 것을 포착합니다 .

나는 이것이 많은 프로세스와 서브쉘을 시작하는 것보다 빠르다고 생각합니다. 잘 작동하는 것 같습니다. 임계값을 낮추고(예: 5로) 매분 확인하도록 crontab 항목을 변경하여 테스트합니다.


CPU 사용량을 확인하세요.lua

#! /usr/local/bin/lua

THRESHOLD = 90  -- percent

-- pipe output of top through a file "f"
f = assert (io.popen ("top -b -n 1 -w 512"))
t = { }

-- check each line
for line in f:lines() do

  -- match top output, eg.
  --   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  -- 30734 nick      20   0 6233848 3.833g 3.731g S   8.6 12.2   3:11.75 VirtualBox

  local pid, user, priority, nice, virt, res, shr, 
        status, cpu, mem, time, command =
    string.match (line,
      "^%s*(%d+)%s+(%a+)%s+(%-?%d+)%s+(%-?%d+)" ..
--         pid      user   priority    nice
      "%s+([%d.]+[g]?)%s+([%d.]+[g]?)%s+([%d.]+[g]?)%s+([DRSTZ])%s+(%d+%.%d+)%s+(%d+%.%d+)" ..
--        virtual          res           shr             status       %cpu        %mem
      "%s+([0-9:.]+)%s+(.*)$")
--         time       command

  -- if a match (first few lines won't) check for CPU threshold
  if pid then
    cpu = tonumber (cpu)
    if cpu >= THRESHOLD then
      table.insert (t, string.format ("%s (%.1f%%)", command, cpu))
    end -- if
  end -- if

end -- for loop

f:close()

-- if any over the limit, alert us
if #t > 0 then
  os.execute ('zenity --title="CPU usage warning!" --info ' ..
              '--text="These processes are using more than ' ..
              THRESHOLD .. '% CPU:\n' ..
              table.concat (t, ", ") ..
              '" --ok-label="OK" ' ..
              '--timeout=60 ' ..   -- close dialog after one minute in case we aren't around
              '--display=:0.0 '  -- ensure visible when running under cron
              )
end -- if

답변2

이와 같은 간단한 스크립트를 작성하십시오.

cpupercentthreshold=75
pstring=""
top -b -n 1 | sed -e "1,7d" | while read line; do
cpuutil=$(echo ${line} | awk '{print $9}' | cut -d"." -f 1)
if [ ${cpuutil} -ge ${cpupercentthreshold} ]
then
  pstring=${pstring}${procname}" "
fi
done
if [ -z "${pstring}" ]
then
  echo "Everything looks good $(date)" >>mylogfile #if you want to keep track 
else
  zenity --title="Warning!" --question --text="These processes are above CPU threshold limit ${pstring}" --ok-label="OK"
fi

그런 다음 명령을 실행 crontab -e하고 다음과 같은 줄을 삽입합니다.

0,15,30,45 * * * * /path/to/my/checker/script 

저장 및 종료. 그런 다음 실행

chmod 755 /path/to/my/checker/script

zenity나는 한동안 Linux 서버에서 그래픽 디스플레이를 사용하지 않았고 사용해 본 적이 없기 때문에 그것에 대해 잘 모릅니다 . 따라서 어떤 이유로든 실패할 경우 에서 도움을 요청하세요 man zenity. xdialog내가 아는 한, 레거시 실행 파일을 대체하는 것입니다.

관련 정보