저는 런어웨이 루비 프로세스를 갖고 있습니다. 이를 트리거하는 방법을 정확히 알고 있습니다.
요점은 통제할 수 없는 프로세스(CPU 사용량 또는 메모리 사용량)에 대해 생각하게 되었다는 것입니다.
cron을 사용하여 런어웨이 프로세스를 모니터링하는 방법은 무엇입니까? grep /top/ulimit?
이런 일이 발생하면 명령줄을 통해 사용자에게 알릴 수 있나요
?Monit의 대안은 무엇입니까?
답변1
당신은 그것을 사용할 수 있습니다아주 좋은유용. 주요 초점은 동적 프로세스 재구성에 있지만 런어웨이 프로세스를 종료하는 옵션도 있으며 구성이 쉽습니다.
답변2
보다 전통적인 접근 방식은 엄격한 제한을 가하는 것입니다 ulimit
. 이는 포크 폭탄을 방지할 수도 있습니다. Marcel Stimberg가 말했듯이, Verynice는 유사한 유틸리티이지만 질문에 포함된 메모리 사용량을 제한하는 대신 좋은 값에만 초점을 맞춥니다.
답변3
아래는 CPU 시간이 3시간 이상인 모든 프로세스를 찾아 종료하는 스크립트입니다. 첫 번째 awk
명령은 프로세스를 필터링합니다. 여기에 루트가 소유하지 않은 프로세스가 있습니다. 먼저 모든 프로세스에 종료 신호( -TERM
)를 보내서 정상적으로 종료하도록 요청합니다. 3초 후에도 살아 있으면 상호 작용 없이 죽입니다( -KILL
).
#!/bin/tcsh
# Get a list of all processes that are not owned by root
set processes = `ps -ef --no-headers | awk '($1 != "root") {print $2}'`
# Iterate over the list of processes and set TERM signal to all of them
foreach process ($processes)
# Get the CPU time of the current process
set cputime = `ps -p $process --no-headers -o cputime | tail -n 1`
# Convert the CPU time to hours
set cputime_hours = `echo $cputime | awk -F: '{print $1+0}'`
# If the CPU time is greater than 3 hours, kill the process
if ($cputime_hours >= 3) then
kill -TERM $process
endif
end
# Give them time to exit cleanly
if (${%processes} > 1) then
sleep 3
endif
# Kill those that are left
foreach process ($processes)
# Get the CPU time of the current process
set cputime = `ps -p $process --no-headers -o cputime | tail -n 1`
# Convert the CPU time to hours
set cputime_hours = `echo $cputime | awk -F: '{print $1+0}'`
# If the CPU time is greater than 3 hours, kill the process
if ($cputime_hours >= 3) then
kill -KILL $process
endif
end
예를 들어 루트로 파일을 생성합니다 /root/kill-old-processes
. 예를 들어 다음을 통해 실행 가능하게 만듭니다.
chmod 750 /root/kill-old-processes
root
그런 다음 (as)를 호출하여 crontab에 추가 할 수 있습니다 root
.
crontab -e
끝에 다음 줄을 추가하십시오.
4,9,14,19,24,29,34,39,44,49,54,59 * * * * /root/kill-old-processes >> /var/log/kill-old-processes.log 2>&1
이 특정 줄은 하루 중 매 시간마다 지정된 분에 5분마다 스크립트를 실행합니다.
간단한 설명: 쉘 스크립트는 를 사용합니다 tcsh
. 아직 설치하지 않았다면 쉘을 설치하십시오.