Linux에서 실패시 서비스를 자동으로 다시 시작하는 방법 방법이 있습니까? 내 질문의

Windows에서는 서비스가 실패 할 때 발생하는 상황을 설정할 수 있습니다. Linux (특히 CentOS)에서 동일한 것을 달성하는 표준 방법이 있습니까?

내 질문의 더 큰 부분은 TIME_WAIT, FIN_WAIT1 등의 상태에서 열린 상태로 유지 된 소켓을 어떻게 처리합니까?입니다.

현재 개발중인 서비스가 충돌하는 경우 소켓이 청취 포트를 지우거나 변경하기를 기다려 수동으로 다시 시작해야합니다.

당신의 도움을 주셔서 감사합니다.



답변

monit실패했을 때 서비스를 모니터링하고 다시 시작하는 좋은 방법입니다. 아마도 다른 필수 서비스 (예 : Apache)에이 서비스를 사용하게 될 것입니다. 있다 nixCraft에 좋은 기사 있지만, 특별히 서비스를 위해이를 사용하는 방법을 자세히 monit자체가이 이상으로 더 많은 기능을 가지고는.

소켓 측면에서 @galraen 은이 지점에 대답했습니다.


답변

서비스 재시작 부분에만 응답합니다. 나는 Monit도 보았지만 CentOS 7에서는 systemd가 모든 것을 처리합니다. 이 두 줄을 .service 파일에 추가하면됩니다 (아직없는 경우).

Restart=always
RestartSec=3

참조 https://jonarcher.info/2015/08/ensure-systemd-services-restart-on-failure/를 참조하십시오.

사용자 지정 시스템 서비스를 만들려면 자체 서비스 파일을 작성하는 것이 매우 간단합니다. 사용자 정의 http 서버에 대해서는 아래 예를 참조하십시오.

새 서비스 파일을 사용하여 편집기를 시작하십시오.

vim /etc/systemd/system/httpd.service

필요에 따라 편집 할 수있는 다음 컨텐츠를 추가하십시오.

[Unit]
Description=My httpd Service
After=network.target

[Service]
Type=simple
User=root
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PERLLIB=/perl
ExecStart=/bin/httpd /etc/httpd.conf
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

부팅시 자동으로 시작되기를 원합니다.

systemctl enable httpd

시스템에 변경 사항을 알려주고 서비스를 시작하십시오.

systemctl daemon-reload
systemctl start httpd

이제 상태를 확인할 수 있습니다.

systemctl status httpd

자세한 내용은 https://scottlinux.com/2014/12/08/how-to-create-a-systemd-service-in-linux-centos-7/을 참조 하십시오.


답변

setsockopt(2)으로 청취 소켓을 호출 할 수 SO_REUSEADDR있으므로 bind(2)모든 연결이 만료되기를 기다리지 않고 다시 소켓을 사용할 수 있습니다 . 또 다른 가능성은 커널에서 연결을 삭제하는 것입니다. FreeBSD는 tcpdrop이것에 대한 명령을 가지고 있으며 Linux에 대해 모른다.


답변

Linux 배포판에서 SysV init 대신 Upstart를 사용하는 경우 respawn키워드가이를 수행합니다.

http://upstart.ubuntu.com/cookbook/#respawn


답변