요청에 따라 소켓 연결을 수신하고 다른 종류의 작업을 수행하는 서버가 있습니다. 그 중 하나는 서버가 분기하는 데이터베이스 쿼리를 오래 보관했습니다.포크와 소켓을 사용할 때 비정상 종료 처리
서버는 모든 활성 하위 로그를 보관하며 시스템 종료를 요청할 때마다 종료되기 전에 모든 자식을 종료합니다. 몇 번 나는 서버가 추락하거나 비정상적으로 죽은 상황에 직면하여 자식 프로세스가 고아가되게했습니다. 서버를 다시 가져 오려고하면 해당 주소/포트가 이미 바인딩되어 있기 때문에 수신 대기 소켓을 바인딩 할 수 없다는 메시지가 거부됩니다.
이 상황을 개선 할 방법을 찾고 있는데, 주 서버 프로세스가 즉시 복구 될 수 있습니다. 나는 아이로부터 부모 존재를 모니터링 해 보았고, 곧 사라지 자마자 나갔다. 그러나 이것은 단지 좀비 프로세스를 가져 왔고 소켓은 여전히 묶여있는 것 같다.
서버는 파이썬으로 작성되었지만 모든 언어로 된 설명이나 제안은 환영합니다.
서버 종료 방법을 알고 있습니까? 신호 처리기에서 문제를 발견 할 수 있다면 자식을 종료 할 수 있습니다. – Kekoa
유닉스의 맛? – sigjuice
하위 프로세스가 상위 프로세스와 종료 프로세스가 사라지는 것을 감지하고 있습니까? 부모가 사라지면 init (pid 1)은 자식 프로세스를 상속 받아야하며 종료 된 자식에 대해 wait()를 호출해야하며 좀비는 절대로 발생하지 않아야합니다. – sigjuice