monit : pidfile없이 프로세스 확인


36

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

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

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

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


( 당신은 여기에 답을 표시해야한다 )
ewwhite

답변:


80

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의 타임 스탬프 테스트 를 사용할 수 있습니다 .


1
주의 : 그것은 작동하지 않을 것입니다. 하나 이상의 프로세스가 있습니다
ruX

1
regexp : matchin "otherstuff. * myprocessname"을 사용할 수 있습니다.
user174962

@ruX : 여러 관련 프로세스가 일치하면 어떻게됩니까? 그들은 어떻게 처리 할 수 ​​있습니까?
kontextify

첫 번째 경기가 걸립니다.
ewwhite

5

해당 기능을 갖춘 즉시 사용 가능한 도구가 없습니다. 분보다 오래 실행되는 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를 인쇄합니다. 결과는 죽었다.


매우 오랜 시간 동안 프로세스 runnig 가 이상한 런타임 (62-13 : 53 : 05)을 얻으므로 regexp 구문 분석 실행 시간은 ([-0-9] + : [0-9] + : [0-9] + 여야합니다. )-표현식의 시작 부분에서 빼기를보십시오.
andrej

3

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 설정 이외에도 실행에 아무런 해가 없습니다.



0

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

    if [[ "$(uname)" = "Linux" ]];then killall --older-than 2m someprocessname;fi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.