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.


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

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.