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 shutdown
w 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]
lubstart on stopping runlevel [x]
? - Jakie byłoby najlepsze rozwiązanie mojego problemu?
Dziękuję Ci bardzo
startup
wydarzeniem 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 przezstartup
. Jeśli nie ma jednegoshutdown
zdarzenia, istnieje zbyt wiele różnych rodzajówshutdown
, aby miało to znaczenie. Lepiej polegać bezpośrednio na zadaniach, które musisz mieć uruchomione.on stopping servicea or stoping serviceb or ...
usług, które potrzebujesz.Aby zatrzymać kontynuowanie zamykania podczas zatrzymania pracy, możesz użyć tego:
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
Również w niektórych przypadkach potrzebujesz czegoś, aby działało do momentu wyłączenia sieci (np. Dbus / network-manager). Do tego chcesz
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.
źródło
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żetask
wrzucony tam, aby upewnić się, że można go ukończyć, zanim zaczną działać inne rzeczy.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
starting
istopping
to 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:
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:
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).
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:
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 ...
źródło
sed
scenariuszem, gdybym był w twoich butach.