Najlepszy sposób na wykonanie haka zamykającego?

9

Ponieważ Ubuntu już od pewnego czasu polega na aktualizacji, chciałbym użyć zadania aktualizacji, aby z wdziękiem zamknąć niektóre aplikacje podczas zamykania systemu lub restartu. Bardzo ważne jest, aby zamknięcie systemu lub ponowne uruchomienie było zablokowane do momentu zamknięcia tych aplikacji.

Czasami aplikacje będą uruchamiane ręcznie, a przy zamykaniu systemu powinno się automatycznie kończyć skryptem (który już mam). Ponieważ aplikacji nie można zakończyć w niezawodny sposób bez uruchomionych (prawie wszystkich) innych usług, zakończenie aplikacji musi nastąpić przed rozpoczęciem reszty zamykania systemu.

Wydaje mi się, że mogę rozwiązać ten problem za pomocą zadania początkowego, które zostanie uruchomione przy wyłączaniu, ale nie jestem pewien, które zdarzenia powinienem zastosować w jaki sposób. Do tej pory przeczytałem następujące (częściowo sprzeczne) stwierdzenia:

  • Podczas uruchamiania nie ma ogólnego zdarzenia zamykania
  • Użyj zwrotki jak start on starting shutdownw definicji zadania
  • Użyj zwrotki jak start on runlevel [06S]w definicji zadania
  • Użyj zwrotki jak start on starting runlevel [06S]w definicji zadania
  • Użyj zwrotki jak start on stopping runlevel [!06S]w definicji zadania

Z tych zaleceń wynikają następujące pytania:

  • Czy w nowszej wersji Ubuntu istnieje ogólne zdarzenie zamknięcia?
  • Jaki jest zalecany sposób wdrożenia „haka zamykającego”?
  • Kiedy są uruchamiane poziomy działania [x]; czy dzieje się tak po wejściu na poziom działania, czy po wejściu na poziom działania?
  • Czy możemy użyć czegoś takiego jak start on starting runlevel [x]lub start on stopping runlevel [x]?
  • Jakie byłoby najlepsze rozwiązanie mojego problemu?

Dziękuję Ci bardzo

Binarus
źródło

Odpowiedzi:

2

startingi runlevelsą osobnymi wydarzeniami, więc nie można powiedzieć sensownie starting runlevel N.

runlevel NZdarzenie jest emitowany na początku wprowadzania poziomu działania. Jeśli tak, start on runlevel Ntwoje zadanie jest uruchamiane przy wejściu. Sposób uruchamiania po zakończeniu wprowadzania na poziom uruchamiania to run on started rc RUNLEVEL=N.

Jak rozumiem, musisz start on runlevel [06S]robić, co chcesz; powinien teoretycznie działać, zanim cokolwiek innego zostanie zatrzymane. Aby uzyskać lepszą kontrolę, możesz użyć start on stopping apache or stopping mysql or ...zadania, aby zadanie zostało uruchomione, zanim którekolwiek z nich będzie mogło zostać zamknięte.


Edytowano, aby zmienić poziom uruchamiania 5 na S.

geekozaur
źródło
1
Ponadto, jedynym powodem jest wybitnym startupwydarzeniem jest to, że coś jest potrzebne do „prime pompy”. Po wysłaniu jednego uprzywilejowanego zdarzenia wszystko inne może być zdefiniowane przez zadania i zadania uruchamiane przez startup. Jeśli nie ma jednego shutdownzdarzenia, istnieje zbyt wiele różnych rodzajów shutdown, aby miało to znaczenie. Lepiej polegać bezpośrednio na zadaniach, które musisz mieć uruchomione.
geekozaur
Dziękuję Ci bardzo. Z wdzięcznością przyjmuję twoją odpowiedź, ponieważ odpowiada ona na moje pytania i rozwiązuje problem. Niemniej jednak mam dodatkowe pytanie / komentarz (który nie jest związany z problemem): AFAIK, głównym celem jest całkowite zastąpienie koncepcji poziomu pracy. Fakt, że musimy polegać na poziomach działania, aby uzyskać globalny hak zamykania, jest sprzeczny z tym celem. Myślę, że upstart będzie musiał wprowadzić takie wydarzenie. Rozumiem wyraźnie, że lepiej byłoby polegać na pracy, której naprawdę potrzebujemy, ale z drugiej strony, w moim przypadku, jest to cała masa prac ... cd ...
Binarus
(prawie wszystko, co działa), a nawet nie odważę się znaleźć związku między procesami działającymi na komputerze (ps-Alf) a zadaniami kontrolującymi te procesy; na pewno nie ma relacji 1: 1. Są zadania, które nie są powiązane z żadnymi procesami (na przykład konfiguracja sieci), i przypuszczam, że jest wystarczająco dużo procesów, które i tak nie są powiązane z zadaniami, a zwłaszcza przy ręcznym uruchamianiu.
Oli
Upstart zastąpił zakodowane poziomy pracy; o ile mogę stwierdzić, koncepcja poziomu działania nie odchodzi, jest teraz zdefiniowana w przestrzeni użytkownika. Jeśli martwisz się o tak długi okres, to skorzystaj z mojej ostatniej sugestii, aby korzystać z on stopping servicea or stoping serviceb or ...usług, które potrzebujesz.
geekozaur
-1 za kilka niedokładności. Całkowicie, to nie zadziała. stop na uruchomionym rc RUNLEVEL = [016] nie różni się frun 'stop na poziomie pracy [016]'. Wynika to z faktu, że żadne zdarzenie nie zablokuje kontynuowania zamykania systemu. Istnieje również niepoprawna składnia, ponieważ „uruchamianie” jest nieprawidłowe. W sumie to tylko myli problem, to w rzeczywistości nie pomaga. Przepraszam, że jest tak późno! Po prostu przeglądam stare odpowiedzi.
SpamapS,
2

Aby zatrzymać kontynuowanie zamykania podczas zatrzymania pracy, możesz użyć tego:

stop on starting rc RUNLEVEL=[016]

Działa to, ponieważ pierwszą rzeczą, która dzieje się po wpisaniu „shutdown”, jest emitowany poziom tunelowy 0. rc uruchamia się na poziomie pracy, a przejście z zatrzymanego -> startu zostanie całkowicie zablokowane, dopóki zadania, które również muszą zmienić stan, nie ukończą tego stanu.

Będziesz chciał upewnić się, że Twój proces szybko reaguje na SIGTERM. Jeśli nie zareaguje w ciągu 5 sekund, upstart wyśle ​​mu SIGKILL. Możesz to podnieść za pomocą „kill timeout X”.

1 w tym miejscu, btw, jest nieco trudne, musisz upewnić się, że twój start zawiera coś, co zaczyna się na poziomie pracy [2345] w tym momencie, aby użytkownik przechodzący do trybu pojedynczego użytkownika ponownie rozpoczął pracę. Na szczęście dużo pracy poświęcono na zrobienie tego sugerowanym początkowym etapem

start on runlevel [2345]

Również w niektórych przypadkach potrzebujesz czegoś, aby działało do momentu wyłączenia sieci (np. Dbus / network-manager). Do tego chcesz

stop on deconfiguring-networking

Jest to zdarzenie emitowane później w trakcie zamykania, które będzie również blokowane, dopóki zadania, które go wykorzystają, nie zakończą całkowicie przejścia w stan.

Spamapy
źródło
Czy miałeś na myśli start on starting ... To, że mój hak zamykający na niczym nie ma sensu. start on starting rc RUNLEVEL=[016]miałoby dużo więcej sensu. I może taskwrzucony tam, aby upewnić się, że można go ukończyć, zanim zaczną działać inne rzeczy.
Tejay Cardon
0

Geekozaur, dziękuję bardzo za pomoc.

W międzyczasie wypróbowałem tę start on runlevel [016]metodę, ale nie zadziałała i myślę, że rozumiem, dlaczego:

Zadanie rzeczywiście zostało uruchomione, ale proces zamykania nie został zablokowany do czasu zakończenia zadania. Jestem pewien, że teraz wydarzenia startingi stoppingto jedyne wydarzenia, które mogą być użyte w definicji pracy blokować inne zadania i myślę, że to, co dorobkiewicz za podręczniki próbują nam powiedzieć. Dlatego użycie zdarzenia poziomu pracy nigdy nie prowadzi do blokowania innych zadań lub procesu zamykania; dlatego jest to bezużyteczne dla mojego celu.

Zamiast tego wydaje mi się, że mam dwie możliwości:

  1. Podążając za jedną z twoich propozycji, znajdź wszystkie zadania, których potrzebują repektywne aplikacje, i umieść je wszystkie w zdarzeniu początkowym skryptu w następujący sposób:

    start on stopping job1 or stopping job2 or ...
    

    To tyle pracy, że poważnie myślę o zrzuceniu listy zadań i uruchomieniu jej przez sed, aby automatycznie utworzyć sekcję początkową dla mojego zadania, które obejmuje wszystkie zadania, które normalnie działają w systemie.

    Zaletą byłoby to, że odpowiednie aplikacje zostałyby zamknięte, nawet jeśli ktoś ręcznie zatrzyma jeden z warunków wstępnych (w przeciwieństwie do zatrzymania ich przez zmianę / wyłączenie / ponowne uruchomienie na poziomie działania).

  2. Znajdź jedno zadanie, które zostanie na początku zatrzymane podczas ponownego uruchamiania / zamykania systemu (nazwijmy to zadanie „FirstJob”) i użyj tego zadania w zwrotce, takiej jak:

    start on stopping FirstJob
    

    Główną wadą byłoby to, że nie wiem, czy taka praca w ogóle istnieje i czy ta praca naprawdę zależy od wszystkich innych zadań, od których faktycznie zależy repozytorium („w tym przypadku zależy od innej pracy” oznacza, że ​​„zostanie zatrzymany” całkowicie, zanim inna praca zacznie się kończyć ").

Nie jestem pewien, która z tych dwóch możliwości jest lepsza ...

Binarus
źródło
W tej chwili zajmowałbym się sedscenariuszem, gdybym był w twoich butach.
geekozaur