bash 스크립트에`fuser -k -n tcp 80`을 작성하는 방법은 무엇입니까?

bash 스크립트에`fuser -k -n tcp 80`을 작성하는 방법은 무엇입니까?

최근 내 웹사이트에 대한 트래픽이 급격히 증가했습니다. 내 Apache가 계속 충돌합니다. httpd/error_log에 다음과 같은 줄이 있습니다.

[Sun Apr 13 08:57:18 2014] [warn] child process 7792 still did not exit, sending a SIGTERM
[Sun Apr 13 08:57:20 2014] [error] child process 7925 still did not exit, sending a SIGKILL
...

다음 달에 서버를 업그레이드할 예정입니다. 그 전에는 5분마다 확인하는 crond 작업을 사용하여 Apache를 자동으로 다시 시작하는 Bash 스크립트를 작성해 보았습니다.

curl일부 페이지를 호출해도 200 코드가 반환되지 않으면 fuser -k -n tcp 80/etc/init.d/httpd restart.

나는 Bash 스크립트를 잘 작성하지 못합니다. 작동하고 Apache를 다시 시작하는 일부 코드를 찾았습니다.

#!/bin/bash

curl -I http://www.mydomain.com/some-empty-page 2>/dev/null \
    | head -1 | grep -q " 200 OK"

if [ $? -eq 0 ]; then 
  echo ""
else 
  /etc/init.d/httpd restart
  echo "wrong $(date)" >> /home/myspace/restart_log.txt
fi

다시 시작하기 전에 포트 80을 사용하는 모든 작업을 종료하려면 어떻게 수정해야 합니까?

다음과 같은 작업 줄을 삽입하겠습니다.

else fuser -k -n tcp 80
  /etc/init.d/httpd restart
  echo "wrong $(date)" >> /home/myspace/restart_log.txt
fi 

참고: 먼저 다른 경우에 else fuser -k -n tcp 80실행합니다 ./etc/init.d/httpd restart

답변1

포트 80의 사용법을 오해하신 것 같습니다. 포트 80에서 수신 대기하는 데몬은 하나만 있습니다. 그런 다음 들어오는 요청을 Apache 작업자 데몬으로 전달합니다. 명령 curl이 HTTP 상태 200을 반환하지 않으면 다시 시작 스크립트를 실행하면 됩니다.

시작되었지만 종료되지 않으려는 Apache를 처리하기 위해 서비스 중지/시작 스크립트에 이미 조항이 있어야 합니다.

다음과 같이 실행된 후에도 다음과 같은 사실을 발견했다면:

$ /etc/init.d/httpd stop
$ pgrep httpd
... returns process ID's...

그런 다음 접근 방식을 약간 변경하여 다음을 수행할 수 있습니다.

$ /etc/init.d/httpd stop
$ pkill httpd
$ /etc/init.d/httpd start

하지만 내가 말했듯이. 이런 일은 정말 해서는 안 됩니다. 서비스 스크립트 /etc/init.d/httpd자체는 이러한 상황을 올바르게 처리할 수 있을 만큼 강력해야 합니다.

스크립트 수정

나는 당신이 가지고 있는 것을 다음과 같이 수정하겠지만, 그렇지 않으면 IMO를 있는 그대로 사용해도 괜찮습니다.

#!/bin/bash

response=$(curl --write-out %{http_code} --connect-timeout 5  \
    --silent --output /dev/null http://www.mydomain.com/some-empty-page)

if [ $response -eq 200 ]; then
  echo "All's well"
else
  /etc/init.d/httpd restart
  echo "wrong $(date)" >> /home/myspace/restart_log.txt
fi

기능을 종료하려면 else 절을 ​​변경하십시오.

else
  /etc/init.d/httpd stop
  pkill httpd
  /etc/init.d/httpd start
  echo "wrong $(date)" >> /home/myspace/restart_log.txt
fi

예를 들어 수행하려는 재시작의 심각도에 따라 pkill더 심각한 종료 신호(SIGKILL이라고도 함 -9)를 제공하도록 확장할 수 있지만 저는 전자부터 시작하겠습니다. Apache 중단이 발생하면 다음에 else 절을 ​​추가하세요. Apache가 여전히 응답하지 않는 경우 SIGKILL을 사용하십시오.

관련 정보