2011-12-01 11 views
6

Mam skrypt do uruchomienia, który uruchamia, który uruchamia serwer, a następnie mówi mu, aby zakończyć z wdziękiem, gdy launchd zabije go (co powinno być przy zamykaniu). Moje pytanie: jaki jest właściwy, idiomatyczny sposób, aby nakazać skryptowi, aby bezczynnie, dopóki nie otrzyma sygnału? Czy powinienem użyć pętli while-true-sleep-1, czy jest lepszy sposób na zrobienie tego?Bash - Jak powinienem pozostawać bezczynny, dopóki nie otrzymam sygnału?

#!/bin/bash 

cd "`dirname "$0"`" 

trap "./serverctl stop" TERM 
./serverctl start 

# wait to receive TERM signal. 
+2

'while while:; spać 1; done' wydaje mi się OK. – choroba

+1

Czy można uzyskać PID procesu spawned przez 'serverctl'? Z 'jobs -p' lub' pgrep -P'? –

+0

Rzeczywisty proces serwera działa w sesji 'screen'. Może nie być złym pomysłem, aby na to czekać, aby niespodziewane wyjście spowodowało zakończenie działania tego skryptu i ostrzeżenie, że proces się zakończył. Z drugiej strony minęło piętnaście miesięcy i działało bez zarzutu. :-P –

Odpowiedz

2

Zwykły wait byłby znacznie mniej zasobochłonny niż blokada spinu, nawet przy uśpieniu.

+2

Nie zaczynam żadnych procesów w tle - jak tu będzie działać? –

+0

Zrobić czekanie na odczytanie fikcyjnej figury, tj. Utworzyć frazę, a następnie wywołać "read Stabledog

+0

Lub po prostu poczekaj na PID demona, który wydajesz się uruchamiać. – tripleee

2

Dlaczego chcesz zachować działanie swojego skryptu? Czy istnieje jakiś powód? Jeśli nie zrobisz nic później po sygnale, nie widzę powodu.

Gdy otrzymasz polecenie TERM od zamknięcia, wtedy plik wykonywalny serverctl i server (jeśli istnieje) również otrzymuje TERM w tym samym czasie.

Aby to zrobić, musisz zainstalować skrypt serverctl jako skrypt rc i pozwolić, aby init (start i) to przerwał. Here Opisałem, jak skonfigurować proces serwera, który nie został pierwotnie zaprojektowany do pracy jako serwer.

+0

Serverctl nie otrzyma TERMINU, ponieważ nie jest trwały. Rzeczywistym procesem trwałym jest serwer Minecraft, którego nie mogę zmodyfikować i który umrze natychmiast po otrzymaniu TERMINU. Ponadto, rc (który w przeciwnym razie byłby oczywistym sposobem, aby to zrobić) jest przestarzałe w systemie Mac OS. –

1

Możesz po prostu użyć "nieskończoności snu". Jeśli chcesz wykonać więcej czynności w zamknięciu i nie chcesz, aby utworzyć funkcję, że alternatywą może być:

#!/bin/bash 
sleep infinity & PID=$! 
trap "kill $PID" INT TERM 

echo starting 
# commands to start your services go here 

wait 

# commands to shutdown your services go here 
echo exited 

Inną alternatywą do „nieskończoności sen” (wydaje BusyBox nie obsługuje go za przykład) może być na przykład "tail -fn0 $ 0".

Powiązane problemy