Jak zmodyfikować zachowanie skryptów na sygnałach za pomocą pułapek Bash
- 4142
- 641
- Maurycy Napierała
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
- « Uzyskaj swoją prognozę pogody z Linux CLI
- LAMP (Linux, Apache, Mariadb, PHP) Wdrażanie obrazu dokera »