Ich arbeite an einem kleinen Control Panel für meinen Server. Ich benötige einen Befehl, der angibt, ob httpd
ausgeführt oder gestoppt wird.
Wird wahrscheinlich den gleichen Code auch für andere Dienste verwenden.
Die meisten Benutzer führen ihren httpd (Apache, Nginx usw.) über ein Init-System aus. Dies ist mit ziemlicher Sicherheit der Fall, wenn Sie von einem Paket aus installiert haben. Bei fast allen dieser Init-Systeme funktioniert eine Methode, wenn sie ausgeführt wird. In meinem Fall verwende ich nginx, das ein Init-Skript im SysV-Stil enthält und ein status
Argument wie das folgende akzeptiert :
$ /etc/init.d/nginx status
* nginx is running
Wenn Sie ein anderes httpd-, script- oder init-System ausführen, haben Sie natürlich eine etwas andere Syntax, aber es sei denn, Sie starten den httpd manuell (was sich wie die schlechteste Idee der Welt anfühlt) wahrscheinlich mit einem netten, verwalteten Startskript, mit dem Sie den Status abfragen können.
In der Antwort von slm geht es mehr um diese Art der Init-Abfrage, aber das Problem mit der Vertrauenswürdigkeit ist, dass Sie nur wirklich wissen, ob ein Prozess noch ausgeführt wird. Der Hauptprozess Ihres httpd könnte ausgeführt werden, ist aber in gewisser Weise festgefahren. Es ist sehr sinnvoll, einfache Init-Tests zu überspringen und mit Verhaltenstests fortzufahren.
Eine Sache, die wir über httpds wissen, ist, dass sie zuhören. Normalerweise am Port *:80
, aber wenn nicht, können Sie den Code nach dem Code anpassen. Hier habe ich nur awk
die Ausgabe von, um netstat
zu sehen, ob es auf dem richtigen Port lauscht.
$ sudo netstat -ntlp | awk '$4=="0.0.0.0:80"'
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2079/nginx
Wir könnten auch überprüfen, welcher Prozess ebenfalls ausgeführt wird, um sicherzustellen, dass der richtige httpd ausgeführt wird. Wir könnten alle möglichen Kontrollen durchführen. Kommt drauf an, wie paranoid du sein willst :)
Aber auch das ist nur ein Spiegelbild eines httpd. Willst du es wirklich testen? Nun, lass es uns testen .
$ wget --spider -S "http://localhost" 2>&1 | awk '/HTTP\// {print $2}'
200
Ich schaue mir nur den Antwortcode an (200 bedeutet "A-Okay!"), Aber wir könnten die Ausgabe erneut untersuchen und testen, um sicherzustellen, dass sie korrekt generiert wird.
Aber auch das ist nicht so gründlich. Sie prüfen localhost
und es werden 200 gemeldet, nichts falsch? Was ist, wenn Biber über das Netzwerkkabel kauten, das den httpd liefert (aber nicht den Rest des Systems)? Dann was?! Sie melden die Verfügbarkeit, wenn Sie tatsächlich nicht erreichbar sind. Nur wenige Dinge sehen unprofessioneller aus als falsche Statusdaten.
Sprechen wir also mit einem externen Server (idealerweise über eine völlig andere Verbindung, in einer anderen weit entfernten Galaxie) und bitten Sie ihn, unseren Server abzufragen:
$ ssh tank 'wget --spider -S "http://bert" 2>&1' | awk '/HTTP\// {print $2}'
200
Zu diesem Zeitpunkt handelt es sich bei allen gemeldeten Problemen entweder um In-App-Probleme (die ihre eigene Fehlerbehandlung und -meldung haben können, oder sie sind am Ende des Clients).
Eine Kombination dieser Tests kann dabei helfen, das Problem zu beheben.
Sie können den Befehl services auf den meisten Linux-Distributionen universell verwenden.
Beispiel
Derselbe Befehl kann für alle Dienste verwendet werden, die einzeln ausgeführt werden, oder um den Status aller Dienste zu ermitteln.
Die verschiedenen Methoden in SysVinit, Systemd und Upstart zum Auflisten von Diensten
Wenn Sie eines der typischeren Service-Management-Frameworks verwenden, können Sie die Services mit den folgenden Methoden auflisten.
SysVinit
Systemd
Emporkömmling
Verweise
quelle