Wie kann man über die Kommandozeile herausfinden, ob httpd läuft oder nicht?

29

Ich arbeite an einem kleinen Control Panel für meinen Server. Ich benötige einen Befehl, der angibt, ob httpdausgeführt oder gestoppt wird.

Wird wahrscheinlich den gleichen Code auch für andere Dienste verwenden.

user70804
quelle

Antworten:

28

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 statusArgument 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 awkdie Ausgabe von, um netstatzu 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 localhostund 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.

Oli
quelle
3
Was ist mit httpd passiert?
Creek
@ Creek Was meinst du?
Oli
4
+1 für eine gute Antwort, aber OP fragte nach httpd und Sie verwendeten Nginx
Creek
4
@ Creek In meinen Büchern bedeutet "httpd" "http-Daemon; ein Webserver". Kein bestimmter. Was denkst du, sollte ich anders machen? Ich weiß nicht, wie ich einen gründlicher untersuchen kann, ohne dass ich ihm zuerst ein Getränk kaufen muss.
Oli
3
Wenn ich dir ein Getränk kaufen könnte, um zu sagen, dass ich es würde, Klassiker. Ich denke, OP bedeutete Apache httpd
Creek
25

Sie können den Befehl services auf den meisten Linux-Distributionen universell verwenden.

$ service <service> status

Beispiel

$ service httpd status
httpd (pid  23569) is running...

Derselbe Befehl kann für alle Dienste verwendet werden, die einzeln ausgeführt werden, oder um den Status aller Dienste zu ermitteln.

$ service --status-all
python is stopped
automount (pid 22457) is running...
Avahi daemon is not running
Avahi DNS daemon is not running
crond (pid  23577) is running...
gpm is stopped
hald is stopped
httpd (pid  23569) is running...
...

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

$  ls -l /etc/init.d/ | head -10
total 220
-rwxr-xr-x 1 root root  1422 Jan 13  2009 ajaxterm
-rwxr-xr-x 1 root root  3052 Apr 20  2012 autofs
-rwxr-xr-x 1 root root  1877 Apr 13  2011 avahi-daemon
-rwxr-xr-x 1 root root  1824 Apr 13  2011 avahi-dnsconfd
-rwxr-xr-x 1 root root  1926 Feb 22  2012 crond
-rwxr-xr-x 1 root root 14291 Dec 19  2011 functions
-rwxr-xr-x 1 root root  1778 Jan  6  2007 gpm
-rwxr-xr-x 1 root root  1586 Mar  5  2011 haldaemon
-rwxr-xr-x 1 root root  5742 Dec 19  2011 halt

Systemd

$ systemctl list-unit-files --type=service | head -10
UNIT FILE                                   STATE   
abrt-ccpp.service                           enabled 
abrt-oops.service                           enabled 
abrt-pstoreoops.service                     disabled
abrt-vmcore.service                         enabled 
abrt-xorg.service                           enabled 
abrtd.service                               enabled 
accounts-daemon.service                     enabled 
alsa-restore.service                        static  
alsa-state.service                          static  

Emporkömmling

$ initctl list | head -10
avahi-daemon start/running, process 1090
mountall-net stop/waiting
nmbd start/running, process 2045
passwd stop/waiting
rc stop/waiting
rsyslog start/running, process 1088
tty4 start/running, process 1211
udev start/running, process 483
upstart-udev-bridge start/running, process 480
ureadahead-other stop/waiting

Verweise

slm
quelle
Dies ist meines Wissens die richtige Antwort. Aber der OP hatte den anderen akzeptiert :)
Ramesh
@Ramesh - das ist OK, Oli's A ist auch richtig, es ist nur ein bisschen esoterischer.
SLM