웹 서버에서 실행중인 여러 프로세스를 모니터링해야합니다. 어떤 이유로 든 니스는 현재 하루나 이틀에 한 번 충돌합니다. 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은 바니시 모니터링을 중지합니다.
누구나이 문제를 해결할 수있는 방법에 대한 제안이 있습니까? 또는 더 나은 방법은 충돌 한 프로세스를 자동으로 모니터링하고 다시 시작하는 다른 간단한 방법을 제안 할 수 있습니까? 감사!
답변
daemontools ( http://cr.yp.to/daemontools.html ) 를 살펴볼 것 입니다.
Supervise는 프로세스를 시작하고 감시하고 프로세스가 종료되면 즉시 다시 시작하기 위해 정확히 이러한 목적으로 만들어졌습니다.
간단한 “아직 실행 중”점검보다 복잡한 작업을 수행해야하는 경우에도 여전히 monit을 사용할 수 있으며 프로세스를 다시 시작해야하는 경우 감독을 통해이를 수행 할 수 있습니다.
답변
/ etc / inittab 을 사용하여 respawn 작업을 사용하여 죽은 프로세스를 다시 시작할 수도 있습니다 .
http://aplawrence.com/Unixart/startup.html의 inittab 섹션을 참조하십시오
답변
서비스를 재시작하기 위해 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 스크립트를 편집하십시오. 아니면이 모든 광택 대신 루트가 아닌 사용자로 실행할 수 있습니까?
마지막으로, 나는 당신이 이것을 알고 있다고 확신하지만 어쨌든 그것을 말할 것입니다. 당신은 분명히 이것에 많은 노력을 기울이고 있습니다. 바니시가 왜 충돌하는지 알아 내고 실제로 수정하는 데 많은 노력을 기울이고 싶습니다.
업데이트 :
이것은 깨끗하지는 않지만 루트 로이 작업을 수행하는 쉬운 방법은 프로세스가 올바른지 확인하고 시작하지 않는지 확인하는 스크립트를 설정하는 것입니다. 그런 다음 몇 분마다 해당 스크립트를 크론 작업으로 실행하십시오.
답변
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 답변 을 참조하십시오 .
답변
또한이 문제를 처리하는 가장 간단한 방법을 찾고있었습니다. 내가 찾을 수있는 가장 쉬운 방법은 단순히 태그의 마지막 줄에 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 이상