Estoy trabajando en un pequeño panel de control para mi servidor. Necesito un comando que diga si se httpd
está ejecutando o detenido.
Probablemente también usará el mismo código para otros servicios.
Estoy trabajando en un pequeño panel de control para mi servidor. Necesito un comando que diga si se httpd
está ejecutando o detenido.
Probablemente también usará el mismo código para otros servicios.
Respuestas:
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 status
argumento, 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 awk
mostrando la salida netstat
para 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 localhost
y 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.
Puede usar el comando de servicios universalmente en la mayoría de las distribuciones de Linux.
$ service <service> status
$ 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...
...
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