2012-06-26 14 views
7

Muszę uruchamiać aplikację co X sekund, więc jeśli cron nie działa z sekundami w ten sposób, napisałem skrypt basha z nieskończoną pętlą, w której spałem przez X sekund.Jak z wdzięcznością zatrzymać nieskończoną pętlę w skrypcie bash?

Kiedy muszę ręcznie zatrzymać uruchomiony skrypt, chciałbym zrobić to w prawidłowy sposób - pozwolić aplikacji na działanie i po prostu nie wchodzić w pętlę po raz kolejny.

Czy masz pojęcie, w jaki sposób można to osiągnąć? Myślałem o przekazywaniu argumentów, ale nie mogłem znaleźć sposobu przekazania argumentu do uruchamiania skryptu.

Odpowiedz

22

Mogłabyś pułapka sygnał, powiedzmy SIGUSR1:

echo "My pid is: $$" 
finish=0 
trap 'finish=1' SIGUSR1 

while ((finish != 1)) 
do 
    stuff 
    sleep 42 
done 

Potem, gdy chcesz wyjść z pętli przy następnej iteracji:

kill -SIGUSR1 pid 

Gdzie pid to proces-ID scenariusz. Jeśli sygnał zostanie podniesiony podczas snu, będzie się budzić (sen będzie spał do pojawienia się jakiegokolwiek sygnału).

+0

Dzięki :) to działa –

2

Możesz przekazać kilka argumentów według pliku. Przy każdej iteracji możesz przeczytać ten plik i sprawdzić, czy zmieniły się twoje warunki działania.

1

Następująca struktura może być odpowiednia, jeśli mimo to trzeba wykonać pewne czyszczenie. Użyj kill, jak pokazano w odpowiedzi cdarke.

#=============================================================== 
# FUNCTION DEFINITIONS 
#=============================================================== 
# . . . 

#=== FUNCTION ================================================ 
#   NAME: cleanup 
# DESCRIPTION: 
#=============================================================== 
cleanup() 
{ 
    # wait for active children, remove empty logfile, ..., exit 
    exit 0 
} # ---------- end of function cleanup ---------- 

#=============================================================== 
# TRAPS 
#=============================================================== 
trap cleanup SIGUSR1 

#=============================================================== 
# MAIN SCRIPT 
#=============================================================== 
echo -e "Script '$0'/PID ${$}" 

while : ; do        # infinite loop 
    # . . . 
    sleep 10 
done 
# . . . 

#=============================================================== 
# STATISTICS/CLEANUP 
#=============================================================== 
cleanup 
0

Rozwiązanie pułapka pisał wcześniej jest dobre dla dużych pętlach, ale uciążliwe dla wspólnej sprawy, gdzie jesteś po prostu zapętlenie nad jedno lub kilka poleceń. W tym przypadku polecam następujące rozwiązanie:

while whatever; do 
    command || break 
done 

To będzie wyjść z pętli, jeśli komenda ma niezerową kod wyjścia, co się stanie, jeśli to zostanie przerwane. Tak więc, chyba że command obsługuje: SIGINT, naciśnięcie ctrl-C spowoduje zatrzymanie bieżącego polecenia i wyjście z pętli.

Edytuj: Po dokładniejszym przeczytaniu Twojego pytania widzę, że chcesz, aby bieżące polecenie było kontynuowane. W takim przypadku to rozwiązanie nie ma zastosowania.

Powiązane problemy