Um zu überprüfen, ob eine Internetseite erreichbar ist, eignet sich wunderbar der Linuxbefehl curl. Eingebaut in ein Skript, und regelmäßig per cron aufgerufen, lässt sich wunderbar darauf reagieren, falls die Webseite mal nicht erreichbar ist, bspw. durch einen Neustart des Server oder um eine Mail an den Administrator zu schicken.
Mit:
curl -s --head --request GET https://www.domain.tld/
kann der Header von www.domain.tld auf der Standardausgabe ausgegeben werden.
Die Ausgabe von curl sieht dann bspw. so aus:
HTTP/1.1 200 200
Date: Sat, 05 Sep 2020 16:06:38 GMT
Server: Apache/2.4.10 (Debian)
Set-Cookie: JSESSIONID=66D95074F8ADD3E23732A320C52309A4; Path=/fe; Secure; HttpOnly
Content-Type: text/html;charset=UTF-8
Vary: Accept-Encoding
Transfer-Encoding: chunked
Kombiniert mit dem Linuxbefehl grep und Prüfung auf den Status 200 (OK), ganz oben im Header zu finden, kann somit die Erreichbarkeit geprüft werden. Das Skript könnte dann so aussehen:
#!/bin/bash
if curl -s --head --request GET https://www.domain.tld/ | grep "200"
> /dev/null; then
echo "Die Domain ist erreichbar"
else
echo "Die Domain ist nicht erreichbar"
fi
In meinem Fall könnte ich den Applikationsserver, ein Apache/Tomact, neu starten, indem ich in ein Verzeichnis eine Datei hochlade mit dem Namen _RESTART_ (Achtung, das gilt nur in meinem speziellen Fall!).
Das Hochladen geht per sftp. Um dies per Skript zu machen benötige ich, um es einfacher zu haben, noch den konsolenbasierten FTP-Client lftp.
Das Skript zur Prüfung der Erreichbarkeit der Domain und ggfs. Neustart des Tomcat, sieht dann so aus:
#!/bin/bash
# in das Arbeitsverzeichnis wechseln:
cd /home/benutzer/skriptverzeichnis/
# Timestampstring erstellen
timestampstring=$( date '+%Y-%m-%d_%H-%M-%S' )
if curl -s --head --request GET https://www.domain.tld/ | grep "200" > /dev/null; then
# Eine (Namens-)Logdatei erstellen (Info)
touch "$timestampstring"_Website_UP
else
# Eine (Namens-)Logdatei erstellen (Info)
touch "$timestampstring"_Server_RESTART
HOST=[:]
USER=
PASSWD=
lftp << EOF
open sftp://$HOST
user $USER $PASSWD
cd temp
put _RESTART_
bye
EOF
fi
Hinweis zu diesem Beispiel: die Datei _RESTART_ (ohne Inhalt) muss im Verzeichnis /home/benutzer/skriptverzeichnis/ vorhanden sein.
Sollte sftp nicht funktionieren, weil wegen eines fehlenden Schlüssels keine Authentifizierung stattfinden kann, muss dieser vorher erstellt werden.
Hierzu genügt es, wenn man auf dem Rechner, auf dem nachher das Skript laufen soll, einen Anmeldeversuch per ssh auf dem Zielrechner startet. Die Frage nach dem Schlüssel beantwortet man noch mit yes, danach kann abgebrochen werden. Der Anmeldeversuch muss auch nicht erfolgreich sein. Nun ist der Schlüssel erstellt und das Skript sollte danach ohne Fehler durchlaufen.
The authenticity of host '[111.222.333.444]:4321 ([444.333.222.111]:4321)' can't be established.
ECDSA key fingerprint is SHA256:P6iJzsEc9pcRsj3TQBAWEBn/4+9PrttcFvXLPjDZpFA.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
yes
Damit die Prüfung regelmäßig erfolgt, bietet es sich an, das Skript regelmäßig per cron aufzurufen. Die Zeile in der Crontab könnte dann bspw. so aussehen, wenn man das Skript zu allen vollen fünf Minuten aufrufen möchte:
*/5 * * * * /home/benutzer/skriptverzeichnis/skriptname