2008-12-17 12 views
25

Mam skrypt, który musi zostać uruchomiony po zakończeniu rozruchu tomcat i jest gotowy do rozpoczęcia wdrażania aplikacji. Używam $TOMCAT_HOME/bin/startup.sh, która natychmiast zwraca. Jak mogę poczekać, aż kocur się zakończy?Poczekaj, aż uruchomi się tomcat

Odpowiedz

36

Istnieje prawdopodobnie kilka sposobów, aby to zrobić. Używamy podstępu:

#!/bin/bash 

until [ "`curl --silent --show-error --connect-timeout 1 -I http://localhost:8080 | grep 'Coyote'`" != "" ]; 
do 
    echo --- sleeping for 10 seconds 
    sleep 10 
done 

echo Tomcat is ready! 

Mam nadzieję, że to pomoże!

+1

jeśli używasz na przykład grep '302 Znaleziono "zamiast grep" Coyote ", to może być również używane na serwerach innych niż Tomcat - np. aby sprawdzić gotowość serwera Jenkins. – vorburger

+0

Jeszcze lepiej: użyj 'curl --silent --write-out '% {response_code} -o/dev/null' [url] ''. To daje ci kod odpowiedzi i możesz go użyć z '[' do przetestowania dowolnej wartości, którą uważasz za właściwą. Prawdopodobnie będziesz także chciał ograniczyć przekierowania. –

1

Zależy od tego, co rozumiesz przez wykańczanie. Na co chcesz czekać?

Można na przykład mieć skrypt, który wielokrotnie uderza w adres URL, dopóki nie uzyska pożądanego wyniku, który byłby dostępny tylko po prawidłowym zainicjowaniu aplikacji.

Istnieje również możliwość użycia detektora kontekstowego, który wypisze plik "Jestem gotowy", który służy do sygnalizowania gotowości aplikacji. (Jeśli to zrobisz, upewnij się, że plik nie istnieje przed uruchomieniem kontenera aplikacji).

0

Nie ma łatwej metody. Jeśli chodzi o startup.sh i catalina.sh, tomcat jest uruchomiony po ich zakończeniu. Chociaż wewnętrznie tomcat nadal inicjuje i uruchamia konteksty.

To pomogłoby wiem, czy próbowali dowiedzieć się, czy kontekst zakończeniu ładowania lub jeśli po prostu chcą ogólnie, „Tomcat jest runnnig chociaż twoje konteksty może nie być w pełni załadowany ...”

Jeśli jest to drugie, możesz stworzyć aplikację internetową, która po prostu posiada detektor kontekstu, który wykona skrypt za pomocą środowiska wykonawczego. Jeśli byłbyś przydatny, możesz ustawić konfigurację webapp poprzez plik web.xml, aby zaakceptować parametr wskazujący skrypt do wykonania.

0

Osobiście oglądałbym dziennik Catalinas dla określonego ciągu znaków, w zależności od konfiguracji i fazy, której szukasz.

+0

Masz na myśli "oglądaj" programowo, oczywiście. – OscarRyz

8

Nie jest trudno wdrożyć programowo. Można zaimplementować org.apache.catalina.LifecycleListener i wtedy będziesz mieć

public void lifecycleEvent(LifecycleEvent lifecycleEvent) { 
      if(lifecycleEvent.getType().equals(Lifecycle.START_EVENT)) 
      //do what you want 
      }  
} 

w web.xml:

<Context path="/examples" ...> 
... 
<Listener className="com.mycompany.mypackage.MyListener" ... > 
... 
</Context> 

Proszę zauważyć, że niektóre rzeczy mogą się różnić między 6-9 Kocurek.

+0

Wydaje się interesujące. Zastanów się, co powinienem zrobić dalej z tą klasą? Jak zarejestrować go w tomcat, jak ten kod może się komunikować z moim skryptem/mrówką, itp.? –

2

Nadal szukasz odpowiedzi? To zależy od twojej definicji rozpoczęcia. Jeśli Twoja definicja uruchomienia to "Teraz można bezpiecznie zatrzymać", możesz sprawdzić, czy port 8005 nasłuchuje.

0

Potrzebowałem tego, aby przetestować jenkinsa, czy tomcat ze zdalnego serwera został uruchomiony w celu sprawdzenia systemu.

until [[ `ssh -o StrictHostKeyChecking=no [email protected]${DEPLOY_HOST} 'netstat -tulpn | grep 8005'` != "" ]] ; do echo "waiting for tomcat"; sleep 6; done

0

Zrobiłem go z następującego kodu w jenkins pipelinescript Tomcat. Przed i po prostu zadzwonić

sudo /bin/systemctl restart tomcat 

I mieć wpis w moim pliku sudoers dla użytkownika jenkins.

Teraz tutaj jest oneliner:

until [ "$(curl -w '%{response_code}' --no-keepalive -o /dev/null --connect-timeout 1 -u USERNAME:PASSWORD http://localhost:8080/manager/text/list)" == "200" ]; do echo --- sleeping for 1 second; sleep 1; done 

lepiej czytelne:

until [ "$(curl -w '%{response_code}' --no-keepalive -o /dev/null --connect-timeout 1 -u USERNAME:PASSWORD http://localhost:8080/manager/text/list)" == "200" ]; 
do echo --- sleeping for 1 second; 
sleep 1; 
done 
Powiązane problemy