cron에서 bash로된 쉘을 실행시킬때.. 좀비가 되는경우가 있습니
글쓴이: rokmn3309 / 작성시간: 토, 2004/12/11 - 11:55오전
안녕하세요..
2.x에 쓰레드로 돌리고 있는 아파치에서 특정시점에 Segmentation fault가 발생하여 서버가 먹통이 되는경우가 종종 있어서 crontab에서 2분마다.. http서버가 응답을 하는지 expect로 telnet으로 통신을 해보고 문제가 있을시에 다시 아파치를 재시작하는 expect를 실행후 메일을 보내주는 쉘을 실행하고 있습니다.
문제는 평상시 체킹하는것 까지는 별 문제가 없이 잘되는데 문제가 생겨서 아파치를 재시작하는 쉘을 실행후 좀비가 되어버리는 문제가 있습니다.
전체적인 루틴은 "클론에서 관리쉘을 호출하면 웹통신체크후 통신이 안돼면 아파치 재시작후 메일을 보내고 종료" 입니다.
다음코드가 클론에서 호출하는 쉘입니다.
#http_control.sh #!/bin/bash checkdomain="127.0.0.1" notifyMailaddr="aaa@bbb.com" serverip=`hostname -i` servername=`hostname` serverdate=`date +%Y-%m-%d` servertime=`date +%H:%M:%S` mailsubject="[SERVERINFO]-"$servername mailcontent="HTTP Restart Time: $serverdate $servertime and Server $servername ( $serverip )" getMsg=`/script/http_live_check.sh $checkdomain` # 아파치 응답여부 getMsgLen=${#getMsg} domsg=${getMsg:$getMsgLen-5:$getMsgLen} if [ "$domsg" != "alive" ] then # 문제가 발생시에 아파치를 재시작하고 관리자에게 메일 전송 /script/auto_http_restart.sh & #/script/auto_http_restart.sh sleep 1 mailhead="$notifyMailaddr -s '$mailsubject'" echo $mailcontent | mail $mailhead exit 0 fi
다음은 텔넷으로 웹서버가 응답하는지 통신하는 쉘입니다.
#http_live_check.sh #!/usr/bin/expect set host [lindex $argv 0] set port 80 spawn telnet $host $port set timeout 5 expect { "Escape character is" { send "HEAD / HTTP/1.0\n\n"; } "Connection refused" { send_user "http death" exit 2 } "Unknown" { send_user "http death" exit 2 } timeout { send_user "http death"; exit 2 } } # port is opened! now check response is good. set timeout 10 expect { "HTTP/1.1" { send_user "http alive" } "Connection closed" { send_user "http death"; } timeout { send_user "http death"; exit 1 } }
다음은 아파치를 재시작하는 쉘입니다. 웹에서 ssl을 사용 해야해서 아파치에서 자동으로 패스워드를 인식하게 했는데 2.x 대로 업후에 인식이 안되어서 쉘에서 자동으로 넣게 만든것입니다.
#auto_http_restart.sh #!/usr/bin/expect set myPath "/data/local/apache-2.0.49/bin/apachectl" set myCmd "$myPath stop" spawn bash -c $myCmd sleep 1 set myCmd "$myPath startssl" while 1 { spawn bash -c $myCmd expect { "*already running" { set myCmd "$myPath stop" sleep 1 } "*not running" { set myCmd "$myPath startssl" sleep 1 } "Enter pass phrase:" { send "mypassword\r" sleep 1 expect "Ok: Pass Phrase Dialog successful." interact exit 0 } default { set myCmd "$myPath startssl" sleep 1 } } } interact exit 0
다음은 클론탭에서 해당 부분입니다.
# apache web daemon responsable check */2 * * * * root /script/http_control.sh & #*/2 * * * * root /script/http_control.sh
Forums:
댓글 달기