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 kill
muszę "killtree"
się ich pozbyć. Jak mogę to zrobić?
Wiem, że należy to zrobić za pomocą control
opcji runit, ale po przeczytaniu dokumentacji nie jest dla mnie jasne, jak powinien się nazywać skrypt stop :(
Odpowiedzi:
Z dokumentów
Oznacza to, że musisz utworzyć
service_name/control/X
X, który jest plikiem wykonywalnym, który będzie działał, gdy wyślesz powiązanesv
polecenie do usługi, takie jakd
polecenie (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.źródło
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.
źródło
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
t
plik kontroli sygnału zakończenia, ponieważ jest to plik zarezerwowany dla terminu sygnał. Skrypt powinien być wykonywalny.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.
źródło