Úvod
Skript shellu může při svém provádění narazit na problémy, což má za následek chybový signál, který skript neočekávaně přeruší.
K chybám dochází v důsledku chybného návrhu skriptu, akcí uživatele nebo selhání systému. Skript, který selže, může zanechat dočasné soubory, které způsobí potíže, když uživatel skript restartuje.
Tento tutoriál vám ukáže, jak používat trap
zajistíte, že se vaše skripty vždy předvídatelně ukončí.
Předpoklady
- Přístup k terminálu/příkazovému řádku.
- Textový editor (Nano, Vi/Vim atd.).
Syntaxe pasti bash
Syntaxe pro trap
příkaz je:
trap [options] "[arguments]" [signals]
Příkaz má následující součásti:
- Možnosti poskytují k příkazu další funkce.
- Argumenty jsou příkazy
trap
spustí se při detekci signálu. Pokud není příkaz pouze jedním slovem, měl by být uzavřen v uvozovkách (" "
). Pokud argument obsahuje více než jeden příkaz, oddělte je středníkem (;
). - Signály jsou asynchronní upozornění zasílaná systémem, obvykle indikující přerušení generované uživatelem nebo související se systémem. Signály lze volat jejich jménem nebo číslem.
Možnosti Bash trap
trap
příkaz přijímá následující možnosti:
-p
- Zobrazuje signální příkazy.-l
- Vytiskne seznam všech signálů a jejich čísel.
Níže je uveden úplný seznam 64 signálů a jejich čísla:
# | Signál | # | Signál | # | Signál |
---|---|---|---|---|---|
1 | SIGHUP | 23 | SIGURG | 45 | SIGRTMIN+11 |
2 | SIGINT | 24 | SIGXCPU | 46 | SIGRTMIN+12 |
3 | SIGQUIT | 25 | SIGXFSZ | 47 | SIGRTMIN+13 |
4 | SIGILL | 26 | SIGVTALRM | 48 | SIGRTMIN+14 |
5 | SIGTRAP | 27 | SIGPROF | 49 | SIGRTMIN+15 |
6 | SIGABRT | 28 | SIGWINCH | 50 | SIGRTMAX-14 |
7 | SIGBUS | 29 | SIGIO | 51 | SIGRTMAX-13 |
8 | SIGFPE | 30 | SIGPWR | 52 | SIGRTMAX-12 |
9 | SIGKILL | 31 | SIGSYS | 53 | SIGRTMAX-11 |
10 | SIGUSR1 | 32 | SIGWAITING | 54 | SIGRTMAX-10 |
11 | SIGSEGV | 33 | SIGLWP | 55 | SIGRTMAX-9 |
12 | SIGUSR2 | 34 | SIGRTMIN | 56 | SIGRTMAX-8 |
13 | SIGPIPE | 35 | SIGRTMIN+1 | 57 | SIGRTMAX-7 |
14 | SIGALRM | 36 | SIGRTMIN+2 | 58 | SIGRTMAX-6 |
15 | SIGTERM | 37 | SIGRTMIN+3 | 59 | SIGRTMAX-5 |
16 | SIGSTKFLT | 38 | SIGRTMIN+4 | 60 | SIGRTMAX-4 |
17 | SIGCHLD | 39 | SIGRTMIN+5 | 61 | SIGRTMAX-3 |
18 | SIGCONT | 40 | SIGRTMIN+6 | 62 | SIGRTMAX-2 |
19 | SIGSTOP | 41 | SIGRTMIN+7 | 63 | SIGRTMAX-1 |
20 | SIGTSTP | 42 | SIGRTMIN+8 | 64 | SIGRTMAX |
21 | SIGTTIN | 43 | SIGRTMIN+9 | ||
22 | SIGTTOU | 44 | SIGRTMIN+10 |
Nejčastěji používané signály s trap
příkazy jsou:
SIGHUP (1)
- UkliditSIGINT (2)
- PřerušitSIGQUIT (3)
- KonecSIGABRT (6)
- ZrušitSIGALRM (14)
- BudíkSIGTERM (15)
- Ukončit
Jak používat past v Bash
Typický scénář pro použití trap
příkaz zachycuje SIGINT
signál. Tento signál odešle systém, když uživatel přeruší provádění skriptu stisknutím Ctrl+C .
Následující ukázkový skript vytiskne slovo „Test " každou sekundu, dokud jej uživatel nepřeruší klávesou Ctrl+C . Skript poté vytiskne zprávu a ukončí se.
trap "echo The script is terminated; exit" SIGINT
while true
do
echo Test
sleep 1
done
while
smyčka ve výše uvedeném příkladu se provádí nekonečně. První řádek skriptu obsahuje trap
příkaz a pokyny k čekání na SIGINT
signál, vytiskněte zprávu a ukončete skript.
trap
Příkaz se často používá k vyčištění dočasných souborů, pokud se skript ukončí kvůli přerušení. Následující příklad definuje cleanup
funkce, která vytiskne zprávu, odstraní všechny soubory přidané do $TRASH
proměnnou a ukončí skript.
$TRASH=$(mktemp -t tmp.XXXXXXXXXX)
trap cleanup 1 2 3 6
cleanup()
{
echo "Removing temporary files:"
rm -rf "$TRASH"
exit
}
...
trap
ve výše uvedeném příkladu provede cleanup
funkce, když detekuje jeden ze čtyř signálů:SIGHUP
, SIGINT
, SIGQUIT
nebo SIGABRT
. Signály jsou označeny jejich číslem.
Můžete také použít trap
aby uživatel nemohl přerušit provádění skriptu. Tato funkce je důležitá při provádění citlivých příkazů, jejichž přerušení může trvale poškodit systém. Syntaxe pro deaktivaci signálu je:
trap "" [signal]
Dvojité uvozovky znamenají, že nebude proveden žádný příkaz. Například k zachycení SIGINT
a SIGABRT
signály, zadejte:
trap "" SIGINT SIGABRT
[a command that must not be interrupted]
Pokud chcete signály kdykoli během skriptu znovu povolit, resetujte pravidla pomocí symbolu pomlčky:
trap - SIGINT SIGABRT
[a command that can be interrupted]