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