2시간 이상 휴면 상태이고 CPU 사용량이 90% 이상인 프로세스의 PID를 찾으세요.

2시간 이상 휴면 상태이고 CPU 사용량이 90% 이상인 프로세스의 PID를 찾으세요.

저는 8코어 CPU 시스템을 가지고 있지만 매일 모든 CPU 코어가 휴면 프로세스에 의해 차단되므로 CPU를 복원하려면 수동으로 종료해야 합니다.

다음 프로세스를 자동으로 종료하고 싶습니다

  • 2시간 이상 자고,
  • CPU 사용량이 90%를 초과합니다.

이러한 프로세스의 PID를 찾아 종료하는 방법은 무엇입니까?

여기에 이미지 설명을 입력하세요.

htop의 출력은 PID가 134425인 프로세스가 휴면 상태이며 CPU 코어를 차단하고 있음을 보여줍니다.

노트:

이는 모든 휴면 프로세스의 PID를 제공하지만 CPU 사용량은 고려하지 않습니다.

awk '/sleeping/{ $0=FILENAME; gsub(/[^0-9]/, ""); print $0 }' /proc/[0-9]*/status

답변1

런어웨이 프로세스의 근본 원인을 찾는 것이 가장 좋지만, S상태에 있지만 일정량의 CPU를 사용하는 프로세스를 찾으려면 다음 스크립트를 사용할 수 있습니다.

#!/usr/bin/env bash
ps ahxo pid,state,%cpu |\
while read pid state cpu; do
   if [[ "$state" = S ]]; then
      if [[ "${cpu%%.*}" -gt 90 ]]; then
         echo "woe betide pid $pid"
      fi
   fi
done

스크립트가 시스템을 손상시키지 않는다고 확신하면 kill대신을 사용하십시오. 필드를 기준으로 일치 항목을 제한하거나 명령을 사용하여 적절한 PID를 먼저 필터링하면 echo위험을 줄일 수 있습니다 . 인간의 본성을 고려하면 출력에서 ​​"2시간 이상"을 캡처하는 것은 어렵습니다.commandpgreppstime/proc/$pid/stat 위험할 수도 있다프로세스 이름에 공백이 나타나는지 여부입니다. 또는 모니터링 스크립트가 더 복잡해지고 필요한 조건이 있는 PID를 확인하는 횟수를 기록하는 상태 카운터를 유지할 수 있습니다. 좀 더 복잡한 "2시간 이상" 검사를 수행하기 전에 위 스크립트가 작동하는지 확인해 볼까요?

또 다른 접근 방식은 모니터링 시스템을 사용하여 주기적으로 서비스에 요청을 보내고 요청이 시간 초과되거나 너무 오래 걸릴 때 해당 시스템이 서비스를 다시 시작하도록 하는 것입니다. 그러나 때때로 빗자루로 때려야 하는 경우에는 이와 같은 반창고는 좋은 장기적 해결책이 아닙니다.

서비스에 무언가 손상되었음을 나타내는 일종의 로그 파일이 있는 경우 이는 자동으로 오류를 감지하고 "껐다가 다시 켜는" 또 다른 방법일 수 있습니다.

물론, 재시작 자동화로 인해 잘못된 프로세스가 종료되거나 종료되어서는 안되는 프로세스가 종료되면 심각한 오류가 발생할 수 있습니다. 이는 문제를 찾아 해결하거나 경영진이 문제 해결에 필요한 리소스를 지출할 의사가 없는 경우 소프트웨어를 폐기하는 이유로 사용될 수 있습니다. 관리팀에서 수정을 허용하지 않는 문제로 인해 crontab 작업에서 메모리가 너무 많이 누수되고 있습니다 */5 * * * * /reboot-service... 아 예, 업데이트 등을 수행할 때 비활성화하기 위해 어딘가에 자동 재시작 스크립트를 기록할 수도 있습니다. 더 많은 일.

관련 정보