piątek, 14 sierpnia 2009

Ograniczenie czasowe w skryptach shellowych - komenda timeout

Ostatnio potrzebowałem użyć jakiegoś sposobu do wymuszenia ograniczenia czasowego na wykonanie komendy w skrypcie. Wynikiem moich poszukiwań było zastosowanie komendy timeout. W Gentoo jest ona dostarczana wraz z pakietem 'sys-apps/coreutils'. Jak jej używać?

# timeout 3s find /home -name *pdf

Jeżeli polecenie podane jako argument komendy timeout nie wykona się w ciągu 3 sekund zostanie ono zakończone.
Domyślnie do uruchomionego procesu wysyłany jest sygnał TERM (o sygnałach już wkrótce) - co wymusza na procesie zakończenie działania. Jeśli potrzebujemy możemy wybrać dowolny z dostępnych sygnałów - trzeba jednak mieć na uwadze, że jedynie sygnał nr 9 (SIGKILL) wymusza na procesie zamknięcie. Syganły definujemy poprzez parametr -s po którym podajemy nr sygnału lub jego nazwę:

# time timeout -s9 3s find / -name *pdf

Czas po jakim nastąpi wysłanie sygnału do procesu (bo to chyba słuszniejsza definicja tego co się dzieje) możemy określić w sekundach (s), godzinach (h) lub dniach (d).

Nasuwa się pytanie w jaki sposób sprawdzać czy komenda się zakończyła czy została przerwana?
Można to zweryfikować za pomocą statusu wyjścia $?. Jeśli nastąpił timeout wartość zmiennej wynosi 124 - w pozostałych wypadkach będzie to status zakończenia zwrócony przez wykonane polecenie.

Jak można inaczej zaimplementować timeout w skrypcie? Mi przychodzi do głowy takie rozwiązanie:

# polecenie & sleep 10 && kill %1 && fg

Jak to działa? Pozostawiam to póki co czytelnikowi jako zadanie domowe.

Brak komentarzy:

Prześlij komentarz