Ú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
trapspustí 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]