Ctrl-C w skryptach bash

22

Jak zaimplementować obsługę ctrl+ cskryptów bash, aby skrypt został przerwany, a także aktualnie uruchomioną komendę uruchomioną przez skrypt?

(Wyobraź sobie, że istnieje skrypt, który wykonuje jakieś długo działające polecenie. Użytkownik uderza ctrl+ ci przerywa polecenie, ale skrypt kontynuuje.) Potrzebuję go, aby zachowywał się tak, aby obaj zostali zabici.

kolypto
źródło
1
Jeśli twój system operacyjny ma włączoną kontrolę zadań, inną opcją byłoby zatrzymanie tego skryptu (zwykle z crtl-z). Możesz kontynuować tę pracę w tle bg, zabić ją lub kontynuować na pierwszym planie fg. Zobacz sekcję strony bash JOB CONTROL.
ott--

Odpowiedzi:

25

Robisz to, tworząc podprogram, do którego chcesz zadzwonić po otrzymaniu SIGINT, i musisz uruchomić trap 'subroutinename' INT.

Przykład:

#!/bin/bash

int_handler()
{
    echo "Interrupted."
    # Kill the parent process of the script.
    kill $PPID
    exit 1
}
trap 'int_handler' INT

while true; do
    sleep 1
    echo "I'm still alive!"
done

# We never reach this part.
exit 0
Kvisle
źródło
2
Zauważ, że możesz również złapać się pułapki EXITw przypadkach, gdy masz coś, co chcesz wykonać za każdym razem, gdy skrypt kończy działanie, niezależnie od tego, jak się zatrzymał. ( KILLoczywiście z wyjątkiem).
Blrfl,
Wielkie dzięki! Jednak po zabiciu „uśpienia” - powłoka może nadal być w stanie wykonać następne polecenie, gdy uruchomiona jest procedura pułapki: „echo” w tym przypadku… czy się mylę?
kolypto
To nie powinno być możliwe, nie. Nie wykonuje zadań równolegle.
Kvisle,