¿Cómo saber si httpd se está ejecutando o no a través de la línea de comandos?

29

Estoy trabajando en un pequeño panel de control para mi servidor. Necesito un comando que diga si se httpdestá ejecutando o detenido.

Probablemente también usará el mismo código para otros servicios.

usuario70804
fuente

Respuestas:

28

La mayoría de las personas ejecuta su httpd (Apache, Nginx, etc.) a través de un sistema init. Es casi seguro el caso si lo ha instalado desde un paquete. Casi todos estos sistemas init tienen un método que funciona si se está ejecutando. En mi caso, estoy usando nginx que envía un script de inicio de estilo SysV y que acepta un statusargumento, así:

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

Obviamente, si está ejecutando un sistema httpd, script o init diferente, tendrá una sintaxis ligeramente diferente, pero a menos que esté iniciando manualmente el httpd usted mismo (que se siente como la peor idea del mundo), está probablemente utilizando un script de inicio agradable y administrado que le permitirá consultar el estado.

La respuesta de slm tiene más información sobre este tipo de consulta de inicio, pero el problema con la confianza es que realmente solo te dice si un proceso aún se está ejecutando. El proceso principal de su httpd podría estar ejecutándose, pero de alguna manera bloqueado. Tiene mucho sentido omitir las pruebas de inicio simples y pasar a las pruebas de comportamiento.

Una cosa que sabemos sobre httpds es que escuchan. Por lo general, en el puerto *:80, pero si el suyo no lo hace, puede adaptar el código siguiendo el código. Aquí solo estoy awkmostrando la salida netstatpara ver si está escuchando en el puerto correcto.

$ 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

También podríamos verificar qué proceso se está ejecutando también para asegurarnos de que se está ejecutando el httpd correcto . Podríamos hacer todo tipo de controles. Depende de lo paranoico que quieras ser :)

Pero incluso eso es solo un reflejo de un httpd. ¿Quieres probarlo realmente? Bueno, probémoslo .

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

Solo estoy mirando el código de respuesta (200 significa "¡A-Okay!") Pero nuevamente, podríamos profundizar y probar la salida para asegurarnos de que se genere correctamente.

Pero incluso esto no es tan completo. Estás revisando localhosty está reportando 200, ¿no pasa nada? ¿Qué sucede si los castores muerden el cable de red que suministra el httpd (pero no el resto del sistema)? ¡¿Y que?! Estás informando el tiempo de actividad cuando realmente estás inactivo. Pocas cosas parecen menos profesionales que los datos de estado incorrectos.

Entonces hablemos con un servidor externo (idealmente en una conexión completamente diferente, en otra galaxia muy, muy lejana) y solicitemos que consulte a nuestro servidor:

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

En este punto, cualquier problema que se haya informado son problemas en la aplicación (que pueden tener su propio manejo y notificación de errores, o están al final del cliente).

Una combinación de estas pruebas puede ayudar a determinar dónde está el problema.

Oli
fuente
3
¿Qué pasó con httpd?
Creek
@Creek ¿Qué quieres decir?
Oli
44
+1 para una buena respuesta, pero OP preguntó sobre httpd y usó nginx
Creek
44
@Creek En mis libros, "httpd" significa "http daemon; un servidor web". No uno específico. ¿Qué crees que debería hacer de manera diferente? No sé cómo podría verificar uno más a fondo sin tener que comprarle una bebida primero.
Oli
3
Si pudiera comprarte una bebida por decir que lo haría, clásico. Creo que OP se refería a httpd
Creek
25

Puede usar el comando de servicios universalmente en la mayoría de las distribuciones de Linux.

$ service <service> status

Ejemplo

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

Este mismo comando se puede utilizar para todos los servicios que se ejecutan de forma individual o para encontrar el estado de todos los servicios.

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

Los diversos métodos dentro de SysVinit, Systemd y Upstart para listar servicios

Si está utilizando uno de los marcos de gestión de servicios más típicos, puede utilizar los siguientes métodos para enumerar los servicios dentro de cada uno.

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  

Advenedizo

$ 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

Referencias

slm
fuente
Esta es la respuesta correcta hasta donde yo sé. Pero el OP había aceptado el otro :)
Ramesh
@Ramesh: está bien, Oli's A también es correcta, es un poco más esotérica.
slm