2012-10-10 13 views
8

Mam skrypt bash, który montuje i odmontowuje urządzenie, które wykonuje niektóre operacje odczytu pomiędzy. Ponieważ urządzenie działa bardzo wolno, wykonanie skryptu zajmuje około 15 sekund (montaż trwa co najmniej 5-6 sekund). Ponieważ pozostawienie zamontowanego urządzenia może powodować inne problemy, nie chcę, aby ten skrypt został przerwany.Skrypt Bash: nie można poprawnie obsłużyć SIGTSTP

Powiedziawszy to, mogę poprawnie obsługiwać SIGINT (Ctrl + c), ale kiedy próbuję obsłużyć SIGTSTP (Ctrl + Z), skrypt zawiesza się. Co oznacza, że ​​sygnał jest uwięziony, ale program obsługi nie działa.

#!/bin/sh 
cleanup() 
{ 
    # Don't worry about unmounting yet. Just checking if trap works. 
    echo "Quitting..." > /dev/tty 
    exit 0 
} 
trap 'cleanup' SIGTSTP 
... 

Ręcznie muszę wysłać sygnał KILL do procesu. Masz pomysł, dlaczego tak się dzieje i jak mogę to naprawić?

Odpowiedz

4

Powłoka nie wykonuje pułapki, dopóki nie zakończy się aktualnie wykonywany proces. (a przynajmniej takie jest zachowanie bashu 3.00.15). Jeśli wysyłasz polecenie SIGINT przez^c, jest ono wysyłane do wszystkich procesów na pierwszym planie grupy procesów; jeśli aktualnie wykonywany program go odbiera i kończy, wtedy bash może wykonać pułapkę. Podobnie z SIGTSTP przez^z; bash odbiera sygnał, ale nie wykonuje pułapki, dopóki program, który był w trakcie uruchamiania, nie zostanie zakończony, co nie zostanie zrobione, jeśli podejmie domyślne działanie i zostanie zawieszone. Spróbuj zastąpić ... prostym read f i zauważ, że pułapka jest wykonywana natychmiast.

+0

To ma sens. Brzmi tak, chyba że wszystkie pliki binarne, które wykonujesz skryptem, również obsługują^z tak, jak robisz, nie ma sposobu na poprawne obsłużenie^z. Czy to prawda? – Ram

+0

Możesz uruchomić zadanie asynchronicznie w pliku setsid i czekać na niego. np: 'setsid cmd & wait' zamiast tylko' cmd'. –

+0

Wygląda na to. Dzięki za pomoc! Ale ciekawy, czy proces nie zostanie zatrzymany podczas nowej sesji? – Ram

Powiązane problemy