신생 및 다중 신호 종료 프로세스

신생 및 다중 신호 종료 프로세스

저는 Ubuntu에서 resque 작업자 서비스를 실행하고 있으며 이를 관리하기 위해 upstart(Ubuntu의 기본 프로세스 관리자)를 사용하고 싶습니다.

resque 작업자 스레드의 올바른 종료 순서는 QUIT먼저 신호를 보낸 다음 프로세스가 실행 중인 작업을 먼저 완료할 때까지 기다리는 것입니다. 그런 다음 자체적으로 중지되어야 합니다. 작업자 프로세스가 제때 종료되지 않으면 작업이 계속 실행 중이므로(멈췄을 수 있음) TERM작업자 프로세스가 작업을 중단하고 종료하도록 하는 신호를 보내야 합니다 . 분명히 이것이 작동하지 않으면 KILL신호를 보내야 합니다.

이를 달성하는 방법은 pre-start script신호를 보낸 QUIT다음 프로세스가 존재하거나 제한 시간이 만료될 때까지 대기하는 것이라고 생각합니다.

그러나 실제로 일어나는 일은 작업자가 응답 QUIT하고 종료 하면 respawn프로세스가 시작되고 다시 시작되므로 분명히 프로세스 중지가 발생하지 않는다는 것입니다.

어쨌든 프로세스를 중지해야 하는 경우, 신생 기업이 다시 생성되는 것을 막을 수 있는 방법이 있습니까?

답변1

이 문제를 해결하는 두 가지 방법을 찾았지만 둘 다 완벽하지는 않습니다.

  1. 누보 부자에게는 kill signal규칙이 있습니다. kill signal QUIT둘 다 설정 하면 Upstart가 프로세스로 kill timeout 600전송된 다음 다시 전송하기 전에 600초를 기다립니다 . 보내기 전에 프로세스가 종료되면 괜찮습니다. 이 접근 방식에는 몇 가지 문제가 있습니다. (a) 시간 초과 후 전송하는 대신 전송하므로 resque 작업자가 제대로 닫히지 않지만 큰 문제는 아닙니다. (b) 내가 발견한 더 나쁜 문제는 upstart가 세션(우리의 경우)의 모든 프로세스에 "종료 신호"를 보내는 것입니다. 이는 resque 작업자 스레드의 하위 프로세스 작업을 방해할 수 있습니다( 기본 작업은 다음과 같습니다). 코어 덤프가 있습니다.)로 프로세스를 종료합니다.SIGQUITSIGKILLSIGKILLSIGKILLSIGTERMSIGQUITSIGQUIT
  2. 구성된 신생 스타트에서 보낸 신호를 포착하는 자체 래퍼를 구현하고(또는 기본값을 가정 SIGTERM) 모든 정상적인 종료를 직접 처리합니다. 이 경우 kill timeout래퍼가 정상적으로 종료되고 시간이 다 되면 강제로 중단될 수 있도록 Upstart를 충분한 시간으로 설정하는 것이 중요합니다(이 경우 제한 시간이 Upstart의 시간 제한보다 약간 작아야 합니다). 정리를 위해 Upstart에서 수행합니다 SIGKILL(요구 사항에 따라 좋은 생각일 수도 있고 아닐 수도 있음). 단점: 이를 수행하는 것은 매우 복잡합니다. Upstart가 존재하는 이유는 각 서비스에 대해 고유한 프로세스 관리자를 작성할 필요가 없기 때문입니다.

어느 쪽이든 가고 싶지 않은 경우 Upstart가 지원하는 것보다 더 정교한 신호 메커니즘을 구현할 수 있는 다른 프로세스 관리자가 있으며 일반적으로 이러한 메커니즘은 Upstart에서 쉽게 구현하여 문제가 있는 프로세스를 관리할 수 있습니다. 불행히도 모든 상황에서 잘 작동하는 방법을 찾는 것은 어렵습니다. 예를 들어 나는 시도했다파란 알약, 서류상으로는 훌륭해 보이지만 작성 시점에는 눈에 띄는 버그가 있습니다. 여러 신호와 여러 시간 초과가 있는 복잡한 신호 메커니즘을 시도하면 모든 신호를 한 번에(반드시 올바른 순서로 보낼 필요는 없음) 전송하고 자식 프로세스.

추가할 정보가 있는 사람이 있으면 답변을 더 추가해 주세요. 내용이 좋으면 자체 답변 대신 "답변"으로 표시할 수도 있습니다.

답변2

누보부자 출신레시피:

사전 중지를 실행할 때 작업 대상이 이미 "중지"되었으므로 어떤 방법으로든 프로세스를 종료할 수 있으며 프로세스는 다시 생성되지 않습니다(다시 생성 섹션이 있어도).

스크립트의 일부를 보내볼 수 있습니다 QUIT.pre-stop

관련 정보