충돌 한 프로세스를 다시 시작하는 간단한 방법?


10

웹 서버에서 실행중인 여러 프로세스를 모니터링해야합니다. 어떤 이유로 든 니스는 현재 하루나 이틀에 한 번 충돌합니다. monit을 사용하여 광택을 자동으로 다시 시작한다고 생각하지만 작동하지 않습니다. 다음은 Varnish에 대한 monit.conf 항목입니다.

check process varnish with pidfile /var/run/varnish.pid
    start program = "/etc/init.d/varnish start" with timeout 60 seconds
    stop program = "/etc/init.d/varnish stop"
    if failed host <my server ip> port 80 protocol http
        and request "/blank.html" then restart
    if 3 restarts within 5 cycles then timeout
    group server

로그 파일은 니스가 실행을 중지 한 후 시도가 다시 시작된 것을 보여줍니다. 그런 다음 monit은 바니시 모니터링을 중지합니다.

누구나이 문제를 해결할 수있는 방법에 대한 제안이 있습니까? 또는 더 나은 방법은 충돌 한 프로세스를 자동으로 모니터링하고 다시 시작하는 다른 간단한 방법을 제안 할 수 있습니까? 감사!


나는 그러한 것들이 사전 체계화 된 시대에 얼마나 어려웠는지 믿을 수 없다.
Fl0v0

답변:


17

daemontools ( http://cr.yp.to/daemontools.html ) 를 살펴볼 것 입니다.

Supervise는 프로세스를 시작하고 감시하고 프로세스가 종료되면 즉시 다시 시작하기 위해 정확히 이러한 목적으로 만들어졌습니다.

간단한 "아직 실행 중"점검보다 복잡한 작업을 수행해야하는 경우에도 여전히 monit을 사용할 수 있으며 프로세스를 다시 시작해야하는 경우 감독을 통해이를 수행 할 수 있습니다.


불안정한 서비스 프로세스를 모니터링하기 위해 daemontools도 사용합니다. 내가 말해야한다면 아주 편리합니다. :-)
edomaur


2

서비스를 재시작하기 위해 Nagios와 함께 이벤트 핸들러 스크립트를 사용할 수 있습니다 .

니스에 루트 권한이 필요한 경우 (init.d 스크립트에서 일반적으로 수행) "/etc/init.d/varnish start"를 "sudo /etc/init.d/varnish start"로 변경하십시오. 그러나 모든 명령에 대한 전체 sudo nopasswd 권한으로 사용자 monit이 실행하는 것을 원하지 않고 쉘 스크립트에 sudo를주는 것은 기본적으로 나쁘기 때문에 아마도 충분하지 않을 것입니다. 따라서 init 스크립트의 어떤 명령에 sudo가 필요한지 알아 내고, / etc / sudoers 파일의 sudo 권한을 monit 사용자에게 제공하고, 그에 따라 해당 init 스크립트를 편집하십시오. 아니면이 모든 광택 대신 루트가 아닌 사용자로 실행할 수 있습니까?

마지막으로, 나는 당신이 이것을 알고 있다고 확신하지만 어쨌든 그것을 말할 것입니다. 당신은 분명히 이것에 많은 노력을 기울이고 있습니다. 바니시가 왜 충돌하는지 알아 내고 실제로 수정하는 데 많은 노력을 기울이고 싶습니다.

업데이트 :
이것은 깨끗하지는 않지만 루트 로이 작업을 수행하는 쉬운 방법은 프로세스가 올바른지 확인하고 시작하지 않는지 확인하는 스크립트를 설정하는 것입니다. 그런 다음 몇 분마다 해당 스크립트를 크론 작업으로 실행하십시오.


나는 처음에 Nagios를 고려했지만 내 목적을 위해 작고 간단한 것을 원했습니다. 그리고 네, 저는 바니시 문제를 조사하고 있습니다. 내 서버 중 하나가 오랫동안 안정적으로 실행되어 왔으므로 분명히 나와 관련이 있습니다. :(
Lin

1

StackOverflow에서 가져온 또 다른 훌륭한 방법 :

until myserver; do
    echo "Server 'myserver' crashed with exit code $?.  Respawning.." >&2
    sleep 1
done

이것은 crontab에 추가 될 수 있습니다 :

crontab -e

그런 다음 규칙을 추가하여 모니터 스크립트를 시작하십시오.

@reboot /usr/local/bin/myservermonitor

또는 스크립트로 추가 /etc/init.d

이것이 왜 좋은 접근법인지에 대한 자세한 설명 은 StackOverflow 답변 을 참조하십시오 .


0

또한이 문제를 처리하는 가장 간단한 방법을 찾고있었습니다. 내가 찾을 수있는 가장 쉬운 방법은 단순히 태그의 마지막 줄에 Restart=allways관련 .service파일에 추가 하는 것 입니다./etc/systemd/system/multi-user.target.wants/[service]

그런 sudo systemctl daemon-reload다음 sudo systemctl restart service.service변경 사항을 다시로드하십시오.

서비스가 실행 중인지 systemctl status processname확인하여 테스트 할 수 있습니다 . 시작 타임 스탬프를 확인하십시오. 그런 ps -ef | grep servicename다음 방금 찾은 id로 프로세스를 종료하십시오 kill 1234. 그런 다음 systemctl status processname다시 시작 타임 스탬프가 업데이트되었는지 확인하십시오.

그것은 작동해야합니다 :

  • 데비안 7과 데비안 8
  • 우분투 15.04 이상
  • CentOS 7 이상
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.