2009-12-27 3 views
2

나는 현재 httpd 프로세스의 수를 나열하는 다음과 같은 bash 스크립트를 가지고있다. 60 세가 넘으면 bash 스크립트가 나를 이메일로 보내야한다. 시간의 80 %는 작동하지만 어떤 이유로 60이 넘지 않을 때 나를 이메일로 보내는 경우가 있습니다. 어떤 아이디어입니까? 시간 T0에서프로세스 카운트 스크립트가 오 탐지를하는 이유는 무엇입니까?

#!/bin/bash 
lines=`ps -ef|grep httpd| wc -l` 
if [ "$lines" -gt "60" ] 
then 
     mailx -s "Over 60 httpd processes" [email protected] < /dev/null 
fi 
+1

응답이 검색 결과에 더 유용 할 수 있도록이 항목을 retitling하는 것을 고려하십시오. –

답변

5
  1. 확인과 이메일 전송 사이에 지연이 있습니다. 그 시간에 일부 httpd 프로세스가 완료되거나 시작될 수 있습니다. 따라서 프로세스 수는 다를 수 있습니다.
  2. grep 프로세스에 프로세스가 포함되어 있습니다. 대부분의 경우 grep이 시작되기 전에 ps이 완료 될 수 있습니다. 쉽게 피할 수있는 방법은 명령을 ps -ef | grep [h]ttpd으로 변경하는 것입니다. 그러면 grepgrep [h]ttpd과 일치하지 않게됩니다.
  3. 리눅스에서는 pgrep으로 사용자의 목적에 더 적합 할 수 있습니다.
  4. grep ... | wc -l은 일반적으로 grep -c ...으로 대체 할 수 있습니다.
  5. httpd 요청의 수를 제한하려면 apache 구성 파일에서 설정할 수 있어야합니다.
+0

grep [h] ttpd가 멋지다는 것을 알지 못했습니다 ... – knittl

+0

Alok의 5 번째 지점이 아마도 여기에 가장 관련이 있습니다. 당신이 처리 한 수를 수동으로 모니터하는 것은 어딘가에 버그를 찾고 있지 않는 한 정확하게 "베스트 프랙티스"가 아닙니다. –

4

당신은 아마 이런 생각했지만, 한 ...

, 당신은 이메일을 읽을 때, 거기에 시간 t1에서 61

, 거기에 58

이메일에 $ lines 값을 입력하면 표시됩니다.

또는/proc/*/cmdline을 사용해보십시오. 더 안정적 일 수 있습니다.

1

"ps -ef | grep httpd"는 단지 httpd 프로세스를 찾지 못합니까? ps에있는 전체 (-f) 목록의 문자열에 "httpd"가 포함 된 프로세스를 찾습니다.

4

grep httpd은 이름에 httpd가 포함 된 모든 프로세스를 찾습니다 (가능한 경우 grep httpd 등이 있음).

+1

'grep [h] ttpd'를 사용하면'grep'이 포함되지 않도록 할 수 있습니다. –

0

이렇게하면 grep과 wc를 하나의 awk로만 사용할 수 있습니다.

ps -eo args|awk '!/awk/&&/httpd/{++c} 
END{ 
    if (c>60){ 
     cmd="mailx -s \047Over 60\047 root" 
     cmd | getline 
    } 
}' 
1

아마도이 방법으로 문제가 해결되지 않지만 pgrep을 사용하면 문제를 단순화 할 수 있습니다.

+0

예! grep ps 출력보다 쉽고 안정적입니다. –

관련 문제