Jak napisać niestandardowy skrypt zatrzymania runit

12

Chcę mieć niestandardowy skrypt „stop” runit( runsv) do wykonania, gdy trzeba zatrzymać / ponownie uruchomić proces. Obecnie po prostu zabija proces, a następnie uruchamia skrypt „wykończenia”. Ale w moim przypadku mój proces spawnuje dynamicznie procesy potomne, więc zamiast prostego killmuszę "killtree"się ich pozbyć. Jak mogę to zrobić?

Wiem, że należy to zrobić za pomocą controlopcji runit, ale po przeczytaniu dokumentacji nie jest dla mnie jasne, jak powinien się nazywać skrypt stop :(

http://smarden.org/runit/runsv.8.html

ddinchev
źródło
Twoja usługa (nie skrypt, ale program) brzmi niewłaściwie, powinna zebrać / posprzątać po własnych dzieciach. Ciekawe, co to jest?
Avery Payne,

Odpowiedzi:

13

Z dokumentów

Dla każdego znaku kontrolnego c wysłanego do rury kontrolnej, runv najpierw sprawdza, czy service / control / c istnieje i jest wykonywalny. Jeśli tak, uruchamia service / control / c i czeka na zakończenie, zanim zinterpretuje polecenie. Jeśli program zakończy działanie z kodem powrotu 0, Runv powstrzymuje się od wysłania do usługi odpowiedniego sygnału. Polecenie o jest zawsze uważane za polecenie u. Na polecenie d sprawdzana jest najpierw usługa / kontrola / t, a następnie usługa / kontrola / d. Na polecenie x sprawdzana jest najpierw usługa / kontrola / t, a następnie usługa / kontrola / x. Kontroli opcjonalnej usługi dziennika nie można dostosować.

Oznacza to, że musisz utworzyć service_name/control/XX, który jest plikiem wykonywalnym, który będzie działał, gdy wyślesz powiązane svpolecenie do usługi, takie jak dpolecenie (w dół). Jeśli skrypt zakończy działanie ze statusem 0, nie będzie próbował wyłączyć samej usługi.

Zasadniczo potrzebujesz skryptu wykonywalnego /etc/sv/<service>/control/d, który zrobi wszystko, co chcesz i zabije usługę, wyczyści pids itp.

rdzeń rdzeniowy
źródło
to naprawdę interesujące i proste, jak działa Runv Dir.
Dzung Nguyen,
2

Prostą odpowiedzią jest nazwanie skryptu oczyszczania „usługą / zakończeniem”. Ten skrypt jest wykonywany po wyjściu z „usługi / uruchomienia”.

Istnieje również interfejs „service / control / ctrl_char. Pozwala on wykonywać różne działania w zależności od polecenia wysyłanego do Runv.

Rik Schneider
źródło
1
usługa / zakończenie działa po wysłaniu TERM CONT do uruchomionej usługi. To bardziej przypomina usługę czyszczenia po zabiciu.
MaximKostrikin
2

Sam musiałem rozwiązać ten problem dla dokera. Miałem uruchomiony serwer uwsgi i został on wysłany przez dokera niewłaściwy sygnał (TERM zamiast INT) o zatrzymaniu kontenera.

Ideą plików control / x jest reagowanie na odbierany sygnał. W moim przypadku umieściłbym tplik kontroli sygnału zakończenia, ponieważ jest to plik zarezerwowany dla terminu sygnał. Skrypt powinien być wykonywalny.

#!/bin/bash
kill -INT `cat /tmp/project-master.pid`

Skrypt wysyła sygnał int do procesu uwsgi, czego chcę.

Jeśli skrypt sterujący wychodzi bez błędu (kod powrotu 0), oryginalny sygnał nie zostanie wysłany do procesu.

W moim przypadku byłem w stanie odebrać termin sygnał i zamiast tego wysłać sygnał int do procesu serwisowego.

itsafire
źródło