Jak zmodyfikować zachowanie skryptów na sygnałach za pomocą pułapek Bash

Jak zmodyfikować zachowanie skryptów na sygnałach za pomocą pułapek Bash

Cel

Celem tego samouczka jest opisanie, jak używać powłoki bash pułapka Zbudowany, aby nasze skrypty były w stanie wykonywać określone działania, gdy otrzymują sygnał lub w innych konkretnych sytuacjach.

Wymagania

  • Bez specjalnych wymagań

Trudność

ŁATWY

Konwencje

  • # - Wymaga podanych poleceń Linuksa, które można wykonać z uprawnieniami root
    bezpośrednio jako użytkownik root lub za pomocą sudo Komenda
  • $ - Wymaga, aby podane polecenia Linux zostały wykonane jako zwykły użytkownik niepewny

Wstęp

Pisząc skrypty, które mają działać przez długi czas, bardzo ważne jest zwiększenie ich odporności, umożliwiając one reagowanie na sygnały systemowe, wykonując określone działania, gdy niektóre z nich zostaną otrzymane. Możemy wykonać to zadanie, używając Bash pułapka wbudowany.

Co to są pułapki?

Pułapka to mechanizm bash, który pozwala dostosować zachowanie skryptu, gdy odbiera sygnał. Jest to na przykład bardzo przydatne, aby upewnić się, że system jest zawsze w stanie spójnym. Wyobraź sobie, że napisałeś skrypt, który w czasie wykonywania musi utworzyć niektóre katalogi: jeśli na przykład zostanie do niego wysłany sygnał Sigint, skrypt zostanie przerwany, pozostawiając za sobą stworzone katalogi. Za pomocą pułapek możemy obsługiwać takie sytuacje.

Składnia pułapki

Składnia pułapki jest bardzo prosta i łatwa do zrozumienia: najpierw musimy wywołać wbudowaną pułapkę, a następnie wykonanie akcji, które mają zostać wykonane, a następnie musimy określić sygnały (y), na które chcemy zareagować:

pułapka [-lp] [[arg] sigspec]

Zobaczmy, co to możliwe pułapka Opcje są dla.

W przypadku użycia z -L Flag, polecenie pułapki wyświetli listę sygnałów powiązanych z ich liczbami. To to samo wyjście, które można uzyskać Zabij -l Komenda:

$ pułapka -l 1) westchnienie 2) sigint 3) sigquit 4) Sigtrap 6) sigabrt 7) sigbus 8) sigfpe 9) sigkill 10) sigusr1 11) sigsegv 12) sigusr2 13) sigpipe 14) sigalrm 15) SigTerm 16 ) Sigstkflt 17) Sigchld 18) Sigcont 19) Sigstop 20) Sigtstp 21) Sigttin 22) Sigttou 23) Sigurg 24) Sigxcpu 25) Sigxfsz 26) Sigvtalrm 27) Sigprof 28) Sigwinch 29) Sigio 30) Sigpwr 31) Sigsys 34) Sigvtalrm 35) Sigrtmin+1 36) Sigrtmin+2 37) Sigrtmin+3 38) Sigrtmin+4 39) Sigrtmin+5 40) Sigrtmin+6 41) Sigrtmin+7 42) Sigrtmin+8 43) Sigrtmin+9 44) Sigrtmin+10 10 45) Sigrtmin+11 46) Sigrtmin+12 47) Sigrtmin+13 48) Sigrtmin+14 49) Sigrtmin+15 50) Sigrtmax-14 51) Sigrtmax-13) Sigrtmax-12 53) Sigrtmax-11 54) Sigrtmax-10) 55) SIGRTMAX-9 56) SIGRTMAX-8) SIGRTMAX-7) SIGRTMAX-6) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) Sigrtmax 

Naprawdę ważne jest, aby określić, że możliwe jest reakcje tylko na sygnały, które pozwalają skryptowi odpowiedzieć: Sigkill I Sigstop Sygnałów nie można złapać, zablokować lub zignorować.

Oprócz sygnałów pułapki mogą również na niektóre Pseudo-sygnał takich jak wyjście, błąd lub debugowanie, ale zobaczymy je szczegółowo. Na razie pamiętaj tylko, że sygnał może być określony przez jego liczbę lub na nazwie, nawet bez Sig prefiks.

O -P opcja teraz. Ta opcja ma sens tylko wtedy, gdy nie zostanie dostarczone polecenie (w przeciwnym razie wywoła błąd). Gdy pułapka jest z nim używana, zostanie wyświetlona lista wcześniej ustawionych pułapek. Jeśli nazwa sygnału zostanie określona, ​​zostanie wyświetlona tylko zestaw pułapki dla tego konkretnego sygnału, w przeciwnym razie nie zostaną dokonane rozróżnienia, a wszystkie pułapki zostaną wyświetlone:

$ pułapka „echo” złapał Sigint!„Sigint

Ustawiliśmy pułapkę, aby złapać sygnał SIGINT: po prostu wyświetli komunikat „Sigint Caught” na ekranie, gdy podany sygnał zostanie odebrany przez powłokę. Jeśli teraz użyjemy pułapki z opcją -p, wyświetli to pułapkę, którą właśnie zdefiniowaliśmy:

$ pułapka -p pułapka -„echo” sigint złapał!„Sigint 

Nawiasem mówiąc, pułapka jest teraz „aktywna”, więc jeśli wyślemy sygnał sigint, albo za pomocą polecenia zabójstwa lub w skrócie CTRL-C, powiązane polecenie w pułapce zostanie wykonane (^C jest właśnie wydrukowane, ponieważ jest wydrukowane, ponieważ jest wydrukowane, ponieważ kluczowej kombinacji):

^CSIGINT CAGHT!

Pułapka w akcji

Teraz napiszmy prosty skrypt, aby wyświetlać pułapkę w akcji, oto:

#!/usr/bin/env bash # # prosty skrypt do pokazania, jak działa pułapka # SET -e Set -u Set -o PipeFail pułapka echo „Złapany sygnał, czyszczenie…”; RM -i Linux_Tarball.smoła.XZ's Sigint Sigterm Echo „Pobieranie Tarball…” wget -o Linux_Tarball.smoła.xz https: // cdn.jądro.org/pub/linux/jądro/v4.X/Linux-4.13.5.smoła.XZ i> /dev /null
Kopiuj

Powyższy skrypt po prostu próbuje pobrać najnowszą tarball jądra Linux do katalogu z tego, co jest uruchamiane za pomocą wget. Podczas zadania, jeśli zostaną odebrane sygnały SIGINT lub SIGTERM (zauważ, jak określić więcej niż jeden sygnał w tej samej linii), częściowo pobrany plik zostanie usunięty.

W takim przypadku polecenie to w rzeczywistości dwa: pierwsze to Echo który drukuje wiadomość na ekranie, a druga to rzeczywista Rm polecenie (dostarczyliśmy do niego opcję -i, więc poprosi o potwierdzenie użytkownika przed usunięciem) i są one oddzielone przez półkolis. Zamiast określać polecenia w ten sposób, możesz również wywołać funkcje: dałoby to większą możliwość ponownego użycia. Zwróć uwagę, że jeśli nie dostarczysz żadnego polecenia, sygnały (y) zostaną po prostu zignorowane!

Jest to dane wyjściowe skryptu powyżej, gdy odbiera sygnał SIGINT:

$ ./Fetchlinux.SH Pobieranie Tarball….smoła.xz '? 

Bardzo ważną rzeczą do zapamiętania jest to, że gdy skrypt zostanie zakończony przez sygnał, jak wyżej, jego status istnienia będzie wynikiem 128 + Numer sygnału. Jak widać, powyższy skrypt, zakończony przez sigint, ma status wyjścia 130:

$ echo $? 130 

Na koniec możesz wyłączyć pułapkę, dzwoniąc pułapka a następnie - Znak, a następnie nazwa lub numer sygnału (ów):

Trap - Sigint Sigterm

Sygnały odzyskają wartość, jaką mieli przy wejściu do Shell.

Pseudo-sygnale

Jak już wspomniano powyżej, pułapka można ustawić nie tylko dla sygnałów, które pozwalają skryptowi odpowiedzieć, ale także na to, co możemy nazwać „pseudo-sygnaliami”. Nie są to technicznie sygnały, ale odpowiadają niektórym sytuacjom, które można określić:

WYJŚCIE

Gdy WYJŚCIE jest określony w pułapce, polecenie pułapki zostanie wykonane po wyjściu ze skorupy.

BŁĄDZIĆ

Spowoduje to wykonanie argumentu pułapki, gdy polecenie zwróci niezerowy status wyjścia, z pewnymi wyjątkami (to samo z opcji errexit powłoki): polecenie nie może być częścią a chwila Lub dopóki pętla; nie może być częścią Jeśli konstruować, ani części && Lub || lista, a jej wartość nie może być odwrócona za pomocą ! operator.

ODPLUSKWIĆ

Spowoduje to wykonanie argumentu pułapki przed każdym prostym poleceniem,
Do, sprawa Lub wybierać Polecenia i przed pierwszym poleceniem w funkcjach powłoki.

POWRÓT

Argument pułapki jest wykonywany po funkcji lub skrypcie pozyskiwanym za pomocą za pomocą źródło albo . Komenda.

Powiązane samouczki Linux:

  • Jak propagować sygnał do procesów dziecka z bash…
  • Jak wykonywać operacje administracyjne z Ansible…
  • Jak zainstalować sygnał na Linux
  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Jak używać polecenia Killall w Linux
  • Jak wyjść ze skryptu Bash
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
  • Polecenia Linux: Top 20 najważniejsze polecenia, które musisz…
  • VirtualBox Zwiększ rozmiar dysku w Linux
  • GNU/Linux Ogólne Przewodnik po rozwiązywaniu problemów dla początkujących