Come scoprire se httpd è in esecuzione o meno tramite riga di comando?


29

Sto lavorando su un piccolo pannello di controllo per il mio server. Ho bisogno di un comando che dirà se httpdè in esecuzione o interrotto.

Probabilmente utilizzerà lo stesso codice anche per altri servizi.

Risposte:


28

Molte persone eseguono il loro httpd (Apache, Nginx, ecc.) Attraverso un sistema init. Questo è quasi certamente il caso se hai installato da un pacchetto. Quasi tutti questi sistemi init hanno un metodo che funziona se è in esecuzione. Nel mio caso sto usando nginx che distribuisce uno script init in stile SysV e che accetta un statusargomento, in questo modo:

$ /etc/init.d/nginx status
 * nginx is running

Ovviamente se stai eseguendo un diverso sistema httpd, script o init, avrai una sintassi leggermente diversa ma a meno che tu non stia lanciando manualmente l'httpd (che sembra l'idea peggiore del mondo), sei probabilmente usando uno script di avvio gestito, che ti permetterà di interrogare lo stato.

La risposta di slm ha di più su questo tipo di interrogazione init, ma il problema con la fiducia è che ti dice davvero solo se un processo è ancora in esecuzione. Il processo principale del tuo httpd potrebbe essere in esecuzione ma in qualche modo bloccato. Ha molto senso saltare semplici test di inizializzazione e passare a test comportamentali.

Una cosa che sappiamo di httpd è che ascoltano. Di solito sulla porta *:80, ma se il tuo non lo fa, puoi adattare il seguente codice. Qui sto solo awkeseguendo l'output di netstatper vedere se è in ascolto sulla porta giusta.

$ 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

Potremmo anche verificare quale processo è in esecuzione anche per assicurarci che sia giusto httpd sia in esecuzione. Potremmo fare tutti i tipi di controlli. Dipende da quanto paranoico vuoi essere :)

Ma anche questo è solo un riflesso di un httpd. Vuoi davvero testarlo? Beh diciamo prova esso.

$ wget --spider -S "http://localhost" 2>&1 | awk '/HTTP\// {print $2}'
200

Sto solo guardando il codice di risposta (200 significa "A-Okay!") Ma, di nuovo, potremmo scavare e testare effettivamente l'output per assicurarci che venga generato correttamente.

Ma anche questo non è così accurato. Stai controllandolocalhost e sta segnalando 200, niente di male? Cosa succede se i castori masticano attraverso il cavo di rete che fornisce l'httpd (ma non il resto del sistema)? E allora ?! Stai segnalando il tempo di attività quando sei effettivamente inattivo. Poche cose sembrano più non professionali dei dati di stato errati.

Quindi parliamo con un server esterno (idealmente su una connessione completamente diversa, in un'altra galassia molto, molto lontana) e chiediamo di interrogare il nostro server:

$ ssh tank 'wget --spider -S "http://bert" 2>&1' | awk '/HTTP\// {print $2}'
200

A questo punto, tutti i problemi segnalati sono problemi in-app (che possono avere il proprio errore nella gestione e nella segnalazione, oppure sono alla fine del cliente).

Una combinazione di questi test può aiutare a chiarire dove si trova anche il problema.


3
cosa è successo a httpd?
Creek,

@Creek Cosa intendi?
Oli,

4
+1 per una buona risposta ma OP ha chiesto di httpd e tu hai usato nginx
Creek il

4
@Creek Nei miei libri, "httpd" significa "daemon http; un web server". Non specifico. Cosa pensi che dovrei fare diversamente? Non so come potrei controllarne uno più approfondito senza dover prima comprare un drink.
Oli,

3
Se potessi offrirti da bere per aver detto che lo farei, classico. Penso che OP significasse httpd
Creek

25

È possibile utilizzare il comando services universalmente sulla maggior parte delle distribuzioni Linux.

$ service <service> status

Esempio

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

Lo stesso comando può essere utilizzato per tutti i servizi in esecuzione su base individuale o per trovare lo stato di tutti i servizi.

$ 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...
...

I vari metodi di SysVinit, Systemd e Upstart per elencare i servizi

Se si utilizza uno dei più tipici framework di gestione dei servizi, è possibile utilizzare i seguenti metodi per elencare i servizi all'interno di ciascuno.

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  

parvenu

$ 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

Riferimenti


Questa è la risposta corretta per quanto ne so. Ma l'OP aveva accettato l'altro :)
Ramesh,

@Ramesh: va bene, anche la A di Oli è corretta, è solo un po 'più esoterica.
slm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.