2010-06-16 2 views
5

나는 최근에이처럼 보였다 로그 메시지를 산출, 전체 얼랑 응용 프로그램이 사망 버그로 실행 :자동으로 다시 시작 얼랑 응용 프로그램을

=INFO REPORT==== 11-Jun-2010::11:07:25 === 
    application: myapp 
    exited: shutdown 
    type: temporary 

나는이 종료 트리거 무슨 생각하지만, 진짜 문제 I가 없다 그것이 스스로 다시 시작하지 않았다는 것입니다. 대신, 지금 비어있는 Erlang VM은 아무것도하지 않고 앉아있었습니다.

지금까지 내가 한 연구에서 '일시적인'및 '영구적 인'응용 프로그램을 제공 할 수있는 다른 "시작 유형"이있는 것처럼 보입니다.

내가 내에서 응용 프로그램을 감독자 를 시작하면, 나는 특정 프로세스 일시적 또는 영구적으로 그것을 말할 수 있고, 자동으로 나를 위해 그것을 다시 시작됩니다. 그러나 설명서에 따르면 응용 프로그램을 일시적으로 또는 영구적으로 만들면 죽을 때 다시 시작하지 않고 모든 다른 응용 프로그램도 종료합니다.

내가 정말로하고 싶은 것은 Erlang VM에 특정 응용 프로그램이 항상 실행 중이어야한다는 것을 어떻게 든 알리고, 그것이 다운되면 다시 시작합니다. 가능한가요?

(내 응용 프로그램 위에 관리자를 구현하는 것에 대해 이야기하는 것이 아닙니다. 왜냐하면 내 관리자 프로세스가 충돌하는 경우 어떻게해야합니까? 내가 사용할 수있는 API 또는 설정을 찾고 있습니까? Erlang에서 나를 위해 내 응용 프로그램을 모니터하고 다시 시작하십시오.)

감사!

답변

5

최상위 수퍼바이저에서이를 해결할 수 있어야합니다. 재시작 전략을 1 초마다 재시작 할 수 있도록 설정하면 응용 프로그램이 중단되지 않아야합니다. 뭔가 같이 :가 다운되면

init(_Args) -> 
    {ok, {{one_for_one, 1000000, 1}, 
      [{ch3, {ch3, start_link, []}, 
      permanent, brutal_kill, worker, [ch3]}]}}.

가 (. 예를 OTP Design Principles User Guide에서 적응)

+0

대단히 감사합니다. 이제 최대 재시작 한도에 도달했기 때문에 죽은 이유가 실제로 나타났습니다. 나는 그것이 단지 재시작 루프에 들어가면 전체 앱을 재시작해야 할 필요가 있기 때문에 반드시 비활성화하는 것을 원하지는 않습니다. 앱을 종료하는 대신 AllowedRestarts/MaxSeconds 제한에 도달하면 앱을 다시 시작하는 방법이 있습니까? – Nick

+1

당신이 당신의 상사에게 감독관을 추가 할 것이라고 설명하는 경우. OTP가 사용하는 동작은 종료 신호가 애플리케이션에 대한 시작 호출을 수행하는 프로세스로 전송 될 때 (즉,최상위 수퍼바이저가 죽을 때) 응용 프로그램이 오류를 수정하지 못한 것으로 가정하고 구성에 따라 응용 프로그램과 가능한 노드를 종료합니다. 요점은 응용 프로그램이 충돌해서는 안되며, 오류가 발생하면 노드 재시작만으로 해결할 수있을 정도로 심각하다는 것입니다. – Lukas

+0

링크는 404입니다 - 누구나 업데이트 할 수 있습니다 ....? – jisaacstone

4

당신은 VM 때 종료 있는지 확인 후 영구적 인 응용 프로그램 유형을 사용하여 전체 VM을 다시 시작 heart을 사용할 수 있습니다 응용 프로그램이 종료됩니다.

궁극적으로 관리자 프로세스, erlang VM 또는 작성한 일부 셸 스크립트 등 무엇이든 신뢰할 수있는 응용 프로그램보다 위에 있어야합니다. 문제가 발생하면 항상 문제가됩니다.

+0

알겠습니다. 고마워요. 이런 종류의 해결책은이 경우 나에게 잘 작동 할 것이다. 그러나 한 번에 둘 이상의 응용 프로그램을 실행하고 필요에 따라 독립적으로 다시 시작하려면 어떻게해야합니까? Erlang에 포함 된 모든 고급 프로세스 관리 기능을 사용하면 애플리케이션이 다운 될 때 애플리케이션을 다시 시작하는 것처럼 간단하게 처리 할 수 ​​없다는 것을 알게되었습니다. – Nick

3

Monit을 사용하여 합리적인 재시작 빈도로 전체 응용 프로그램의 감독자를 사용하여 응용 프로그램을 종료하도록 설정하십시오. 응용 프로그램이 종료되면 VM이 종료되고 monit이 모든 것을 다시 시작합니다.

VM을 한 번만 다시 시작하고 erlang VM의 kill -9를 제대로 처리하지 못하기 때문에 Heart를 충분히 신뢰할 수 없습니다.