셧다운 후크를 만드는 가장 좋은 방법은? 이벤트가 없습니다. start on starting shutdown작업 정의에서

우분투는 지금 당분간 upstart를 사용하기 때문에 upstart 작업을 사용하여 시스템 종료 또는 재부팅시 특정 응용 프로그램을 정상적으로 종료하고 싶습니다. 이러한 응용 프로그램이 종료 될 때까지 시스템의 종료 또는 재부팅이 중지되어야합니다.

응용 프로그램은 경우에 따라 수동으로 시작되며 시스템 종료시 스크립트 (이미 보유한 스크립트)로 자동 종료해야합니다. 다른 서비스가 거의 실행되지 않으면 응용 프로그램을 안정적으로 종료 할 수 없으므로 나머지 종료가 시작되기 전에 응용 프로그램을 종료해야합니다.

종료시 트리거되는 시작 작업 으로이 문제를 해결할 수 있다고 생각하지만 어떤 이벤트를 어떤 방식으로 사용 해야하는지 확실하지 않습니다. 지금까지 나는 (일부 모순되는) 진술을 읽었습니다.

  • 시작시 일반적인 종료 이벤트가 없습니다.
  • start on starting shutdown작업 정의에서 와 같이 스탠자를 사용하십시오.
  • start on runlevel [06S]작업 정의에서 와 같이 스탠자를 사용하십시오.
  • start on starting runlevel [06S]작업 정의에서 와 같이 스탠자를 사용하십시오.
  • start on stopping runlevel [!06S]작업 정의에서 와 같이 스탠자를 사용하십시오.

이러한 권장 사항에서 다음과 같은 질문이 발생합니다.

  • 우분투의 시작에 일반적인 종료 이벤트가 있습니까?
  • “종료 훅”을 구현하기 위해 권장되는 방법은 무엇입니까?
  • 이벤트 런레벨 [x]가 언제 트리거됩니까? 런레벨에 진입했을 때 또는 런레벨에 진입 할 때 이것이 있습니까?
  • start on starting runlevel [x]또는 같은 것을 사용할 수 있습니까 start on stopping runlevel [x]?
  • 내 문제에 가장 적합한 솔루션은 무엇입니까?

대단히 감사합니다



답변

starting그리고 runlevel당신이 의미있게 말할 수 있도록 별도의 이벤트입니다 starting runlevel N.

runlevel N이벤트 실행 레벨 진입의 시작에서 방출된다. 그렇다면 start on runlevel N작업이 시작될 때 실행됩니다. 런레벨 진입이 완료 될 때 실행하는 방법은 run on started rc RUNLEVEL=N입니다.

내가 이해 한대로 start on runlevel [06S]원하는 것을 해야합니다 . 이론적으로 다른 것을 멈추기 전에 실행해야합니다. 보다 세밀한 제어를 start on stopping apache or stopping mysql or ...위해 작업을 종료하기 전에 작업을 실행할 수 있습니다.


런레벨 5를 S로 변경하도록 편집되었습니다.


답변

작업이 중지되는 동안 종료가 진행되지 않게하려면 다음을 사용하십시오.

stop on starting rc RUNLEVEL=[016]

이것은 ‘shutdown’을 입력 할 때 가장 먼저 발생하는 것이 tunlevel 0이기 때문에 작동합니다. rc는 실행 레벨에서 시작하고 중지 된-> 시작에서 전이는 상태를 변경해야하는 작업이 해당 상태를 완료 할 때까지 완전히 차단됩니다.

프로세스가 SIGTERM에 신속하게 응답하는지 확인하고 싶을 것입니다. 5 초 내에 응답하지 않으면 upstart는 SIGKILL을 보냅니다. ‘kill timeout X’로이를 높일 수 있습니다.

거기에있는 1, btw는 약간 까다롭기 때문에 시작 시점에 런레벨 [2345]에서 시작하는 것이 포함되어 있는지 확인해야합니다. 따라서 단일 사용자 모드 유지 보수를 위해 내려가는 사용자가 작업을 다시 시작해야합니다. 운 좋게도 이것을 제안 된 평소에 시작하는 데 많은 노력을 기울였습니다.

start on runlevel [2345]

또한 어떤 경우에는 네트워크가 다운 될 때까지 (dbus / network-manager와 같은) 계속 실행해야 할 것이 필요합니다. 당신이 원하는

stop on deconfiguring-networking

이는 종료 후반에 발생하는 이벤트로,이를 사용하는 작업이 상태 전이를 완전히 완료 할 때까지 차단됩니다.


답변

Geekosaur, 도와 주셔서 감사합니다.

그동안 start on runlevel [016]방법 을 시도했지만 작동하지 않았으며 이유를 이해한다고 생각합니다.

작업이 실제로 시작되었지만 작업 작업이 완료 될 때까지 종료 프로세스가 차단되지 않았습니다. 나는 확실히 지금 이벤트 것을 확실히 생각 starting하고 stopping다른 작업을 차단하는 작업 정의에 사용할 수있는 유일한 이벤트이며, 나는이 갑자기 출세의 매뉴얼이 우리에게 무엇을하려고 생각합니다. 따라서 실행 레벨 이벤트를 사용하면 다른 작업 또는 종료 프로세스가 차단되지 않습니다. 따라서 내 목적에는 쓸모가 없습니다.

대신 두 가지 가능성이있는 것 같습니다.

  1. 귀하의 제안 중 하나에 따라, 회답 응용 프로그램에 필요한 모든 작업을 찾아서 스크립트의 시작 이벤트에 모든 작업을 포함 시키십시오.

    start on stopping job1 or stopping job2 or ...
    

    이것은 너무 많은 작업이므로 작업 목록을 덤프하고 sed를 통해 실행하여 시스템에서 일반적으로 실행되는 모든 작업을 포함하는 내 작업의 시작 스탠자를 자동으로 생성하는 것을 심각하게 생각 하고 있습니다.

    장점은 누군가가 전제 조건 중 하나를 수동으로 중지하더라도 (런레벨 변경 / 종료 / 재부팅으로 애플리케이션을 중지하는 것과 달리) 각 애플리케이션이 종료된다는 것입니다.

  2. 시스템을 재부팅 / 종료 할 때 처음에 중지 될 하나의 작업 (이 작업을 “FirstJob”이라고 함)을 찾아 스탠자에서 해당 작업을 사용하십시오.

    start on stopping FirstJob
    

    주요 단점은 그러한 작업이 존재하는지 여부와 그 작업이 실제로 응용 프로그램이 실제로 의존하는 다른 모든 작업에 의존하는지 여부 (이 경우 “다른 작업에 따라 다름”)는 “중지됨을 의미합니다 다른 작업이 중지되기 전에 완전히 “

두 가능성 중 어느 것이 더 좋은지 잘 모르겠습니다 …