셧다운 후크를 만드는 가장 좋은 방법은?


9

우분투는 지금 당분간 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]?
  • 내 문제에 가장 적합한 솔루션은 무엇입니까?

대단히 감사합니다

답변:


2

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로 변경하도록 편집되었습니다.


1
또한 주목할만한 startup사건이 있는 유일한 이유는 "펌프를 프라이밍"하기 위해 무언가 가 필요하기 때문입니다. 권한있는 이벤트 하나가 전송 된 후 다른 모든 이벤트는에 의해 트리거 된 작업 및 태스크에 의해 정의 될 수 있습니다 startup. 단일 shutdown이벤트 가없는 경우, shutdown의미가있는 다른 종류가 너무 많습니다 . 실행해야하는 작업에 직접 의존하는 것이 좋습니다.
geekosaur

대단히 감사합니다. 질문에 답변하고 문제를 해결하므로 답장을 보내 주셔서 감사합니다. 그럼에도 불구하고, 나는 추가적인 질문 / 의견 (문제와 관련이 없음)을 가지고 있습니다 : AFAIK, runlevel 개념을 완전히 대체하는 것이 upstart의 목표입니다. 글로벌 셧다운 훅을 얻기 위해 런레벨에 의존해야한다는 사실은이 목표와 모순됩니다. 나는 upstart가 그러한 이벤트를 소개해야 할 것이라고 생각합니다. 나는 명확하게 우리가 정말 필요로하는 작업에 의존하는 것이 더 될 것이라고 이해하고 있지만, 다른 한편으로는, 내 경우에는, 그것은 작업의 전체 무리 ... 계속 ...이다
Binarus

(거의 실행되는 거의 모든 것), 나는 심지어 상자에서 실행되는 프로세스 (ps -Alf)와 이러한 프로세스를 제어하는 ​​작업 사이의 관계를 찾는 것에 대해 감히 생각하지 않습니다. 확실히 1 : 1 관계가 없습니다. 프로세스와 관련이없는 작업 (예 : 네트워크 구성)이 있으며 어쨌든 특히 수동으로 작업을 시작할 때 작업과 관련이없는 프로세스가 충분하다고 가정합니다.
Oli

업 스타트는 하드 코딩 된 런레벨을 대체했습니다 . 내가 알 수있는 한, 런레벨 개념 은 사라지지 않고 단지 사용자 공간에 정의되어 있습니다. 당신이 그런 장기적인 걱정이 있다면, 당신은 당신이 실행 on stopping servicea or stoping serviceb or ...해야하는 모든 서비스 에 대한 나의 마지막 제안을 사용하고 싶습니다 .
geekosaur

몇 가지 부정확 한 경우 -1입니다. 플랫 아웃, 이것은 실제로 작동하지 않습니다. 시작시 중지 rc RUNLEVEL = [016]은 다른 실행이 아닙니다 '런레벨에서 중지 [016]'. 두 이벤트 모두 종료 진행을 차단하지 않기 때문입니다. 'run on'이 유효하지 않으므로 유효하지 않은 구문도 있습니다. 이 모든 것이 문제를 혼란스럽게 만들고 실제로 도움이되지는 않습니다. 너무 늦어서 죄송합니다! 이전 답변을 검토하는 중입니다.
SpamapS

2

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

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

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


이것을 찾으 셨나요? start on starting ... 그것은 아무것도 내 종료 후크 정지가 훨씬 이해가되지 않습니다. start on starting rc RUNLEVEL=[016]훨씬 더 이해가 될 것입니다. 그리고 task다른 것들이 실행되기 전에 완료 될 수 있도록 거기에 던져 질 수도 있습니다.
Tejay Cardon

0

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

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

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

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

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

    start on stopping job1 or stopping job2 or ...
    

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

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

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

    start on stopping FirstJob
    

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

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


내가 sed네 신발에 있다면 지금 당장 대본을 쓰고있을거야
geekosaur
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.