monit : pidfile없이 프로세스 확인 지정된 이름으로 모든 프로세스를 종료하는

X 시간 이상 실행 된 지정된 이름으로 모든 프로세스를 종료하는 방법을 찾고 있습니다. 나는이 특정 실행 파일의 많은 인스턴스를 생성했으며 때로는 나쁜 상태가되어 영원히 CPU를 많이 사용하여 영원히 실행됩니다.

이미 monit을 사용하고 있지만 pid 파일이없는 프로세스를 확인하는 방법을 모르겠습니다. 규칙은 다음과 같습니다.

kill all processes named xxxx that have a running time greater than 2 minutes

monit에서 이것을 어떻게 표현 하시겠습니까?



답변

monit에서는 PID가없는 프로세스에 일치하는 문자열을 사용할 수 있습니다. “myprocessname”이라는 프로세스의 예를 사용하여

check process myprocessname
        matching "myprocessname"
        start program = "/etc/init.d/myproccessname start"
        stop program = "/usr/bin/killall myprocessname"
        if cpu usage > 95% for 10 cycles then restart

CPU로드가 10 회 모니터링주기 (각 30 초) 동안 특정 레벨인지 확인한 후 다시 시작하거나 종료하면 옵션이 될 수 있습니다. 또는 프로세스와 관련된 파일에서 monit의 타임 스탬프 테스트 를 사용할 수 있습니다 .


답변

해당 기능을 갖춘 즉시 사용 가능한 도구가 없습니다. 분보다 오래 실행되는 php-cgi 스크립트를 죽이고 싶다고 가정 해 봅시다. 이 작업을 수행:

pgrep php-cgi | xargs ps -o pid,time | perl -ne 'print "$1 " if /^\s*([0-9]+) ([0-9]+:[0-9]+:[0-9]+)/ && $2 gt "00:01:00"' | xargs kill

pgrep프로세스는 이름으로 프로세스를 선택 ps -o pid,time하고 모든 pid에 대해 런타임을 인쇄 한 다음 라인을 분석하고 시간을 추출하며 정의 된 프로세스 와 시간이 비교되면 pid를 인쇄합니다. 결과는 죽었다.


답변

ps-watcher 로이 정확한 문제를 해결 하고 몇 년 전에 linux.com 에 썼습니다 . ps-watcher를 사용하면 프로세스를 모니터링하고 누적 된 런타임에 따라 프로세스를 종료 할 수 있습니다. 프로세스 이름이 ‘foo’라고 가정하면 관련 ps-watcher 구성은 다음과 같습니다.

[foo]
  occurs = every
  trigger = elapsed2secs('$time') > 1*HOURS && $ppid != 1
  action = <<EOT
  echo "$command accumulated too much CPU time" | /bin/mail user\@host
  kill -TERM $pid
EOT

[foo?]
   occurs = none
   action = /usr/local/etc/foo restart

열쇠는 선입니다

trigger = elapsed2secs('$time') > 1*HOURS && $ppid != 1`

‘누적 프로세스 시간이> 1 시간이고 부모 프로세스가 아닌 경우 다시 시작하십시오.

그래서 대답은 monit을 사용하지 않지만 작동한다는 것을 알고 있습니다. ps-watcher 는 가볍고 설정하기 쉬우므로 monit 설정 이외에도 실행에 아무런 해가 없습니다.


답변

Monit는 버전 5.4에서이를 수행 할 수 있습니다.

if uptime > 3 days then restart

참조 : 프로젝트 파일을 변경


답변

이것을 exec 문으로 monit에 사용할 수 있습니다.

    if [[ "$(uname)" = "Linux" ]];then killall --older-than 2m someprocessname;fi


답변