Un miembro de la comunidad Linux en español (castellano) en Google Plus preguntaba cómo podía saber cuándo fue la última vez que se reinició el servidor Web Apache. He aquí la respuesta.



Cada vez que se reinicia el servidor Apache, se registra dicho evento en el log de errores (por defecto /var/log/apache2/error.log en Debian y derivados).

Al detener el servidor, lo cual se traduce a terminar el proceso en cuestión, se registra el siguiente evento:

[Fri May 08 10:30:35 2015] [notice] caught SIGTERM, shutting down

Al iniciar nuevamente, se registra el mensaje "resuming normal operations", siempre que el servidor inicie correctamente, claro está.

[Fri May 08 10:30:36 2015] [notice] Apache/2.2.16 (Debian) PHP/5.3.3-7+squeeze23 with Suhosin-Patch mod_python/3.3.1 Python/2.6.6 mod_perl/2.0.4 Perl/v5.10.1 configured -- resuming normal operations

Por lo tanto, es posible determinar cuándo fueron las últimas veces que un servidor Apache fue reiniciado buscando la frase "resuming normal operations" en el log de errores:

root@debian:~# grep "resuming normal operations" /var/log/apache2/error.log | cut -d'[' -f2 | sed -e 's/]//'
Sun May 03 06:25:38 2015 
Fri May 08 10:30:36 2015 
Sun Apr 26 06:25:33 2015

Entonces, para saber con exactitud cuándo fue la última vez que se reinició Apache, simplemente filtrar la última fila:

root@debian:~# grep "resuming normal operations" /var/log/apache2/error.log | tail -n 1 | cut -d'[' -f2 | sed -e 's/]//'
Sun Apr 26 06:25:33 2015

Se debe tener en cuenta que esta información proviene de los logs de Apache, por lo tanto la validez de la misma depende de la integridad de los logs. Es decir la fecha será verdadera siempre que los logs no estén corruptos ni hayan sido manipulados.

Una forma mucho más confiable de obtener la fecha de inicio de Apache consiste en consultar directamente al sistema operativo, es decir al kernel Linux, a través de la información contenida en el sistema de archivos /proc. Primero se debe obtener el PID del proceso Apache (el proceso inicial, no los hijos que se forkean para atender las solicitudes), y luego se debe determinar la fecha en la cual el kernel creó al directorio correspondiente al PID dentro del sistema de archivos /proc. Por ejemplo:

fulano@debian:~$ ls -od --time-style=+%d-%m-%Y /proc/$(ps axo pid,cmd | grep apache | head -n 1 | sed -e 's/^ *//' | cut -d' ' -f1) | cut -d' ' -f 5
25-04-2015

Se observa que el proceso ha sido creado el 25 de abril de 2015.

Aunque si se consulta al log de Apache:

root@debian# grep "resuming normal operations" /var/log/apache2/error.log | tail -n 1 | cut -d'[' -f2 | sed -e 's/]//'
Fri May 08 13:27:46 2015

Se observa que la fecha de inicio es diferente, más actual. La causa de esta diferencia es debido a que el mensaje "resuming normal operations" en el log también se produce cuando se recarga la configuración de Apache:

root@debian# history | grep service | grep apache | grep -v grep
  232  service apache2 restart
  442  service apache2 reload
  496  service apache2 reload

Cuando se recarga la configuración de Apache, el proceso no se reinicia (se puede comprobar verificando que Apache mantiene el mismo PID, y no existe una correspondiente entrada con el mensaje "caught SIGTERM, shutting down" en el log). Por ende, la fecha de inicio de Apache más confiable se obtiene consultando la fecha de creación del proceso en el kernel:

ls -od --time-style=+%d-%m-%Y /proc/$(ps axo pid,cmd | grep apache | head -n 1 | sed -e 's/^ *//' | cut -d' ' -f1) | cut -d' ' -f 5

Ahora bien, si quisiéramos conocer todas las veces que Apache fue reiniciado (o ha sido recargada su configuración, tal como hemos visto), el primer comando sólo sirve para reinicios en los últimos días. Esto se debe a que la herramienta logrotate rota y comprime los logs periódicamente. Entonces en lugar de utilizar sólo cat para imprimir el contenido de los archivos por stdout, es necesario utilizar también zcat (parte del paquete gzip, la cual descomprime y luego imprime por stdout):

root@debian:~# (cat /var/log/apache2/*.log; zcat /var/log/apache2/*.gz) | grep "resuming normal operations" | cut -d'[' -f2 | sed -e 's/]//' | sort
Fri Aug 15 07:22:50 2014 
Fri Dec 05 14:07:07 2014 
Fri Dec 05 19:52:15 2014 
Fri Jan 23 20:01:14 2015 
Fri Mar 20 16:00:57 2015 
Fri May 08 10:30:36 2015 
Mon Aug 04 11:03:50 2014 
Mon Oct 06 08:03:49 2014 
Mon Oct 06 08:03:49 2014 
Mon Oct 06 08:03:52 2014 
Mon Oct 27 10:35:17 2014 
Mon Oct 27 10:35:17 2014 
Sat Apr 18 10:13:15 2015 
Sat Dec 13 12:54:44 2014 
Sun Apr 05 06:25:34 2015 
Sun Apr 12 06:25:36 2015 
Sun Apr 19 06:25:45 2015 
Sun Aug 03 06:25:19 2014 
Sun Aug 10 06:25:38 2014 
Sun Aug 17 06:25:16 2014 
Sun Aug 24 06:25:19 2014 
Sun Aug 31 06:25:19 2014 
Sun Dec 07 06:25:47 2014 
Sun Dec 14 06:26:04 2014 
Sun Dec 21 06:26:08 2014 
Sun Dec 28 06:25:44 2014 
Sun Feb 01 06:25:46 2015 
Sun Feb 08 06:25:40 2015 
Sun Feb 15 06:25:40 2015 
Sun Feb 22 06:25:51 2015 
Sun Jan 04 06:25:48 2015 
Sun Jan 11 06:25:38 2015 
Sun Jan 18 06:25:27 2015 
Sun Jan 25 06:25:15 2015 
Sun Jul 06 06:25:43 2014 
Sun Jul 13 06:25:31 2014 
Sun Jul 20 06:25:27 2014 
Sun Jul 27 06:25:25 2014 
Sun Jun 01 06:25:21 2014 
Sun Jun 08 06:25:18 2014 
Sun Jun 15 06:25:18 2014 
Sun Jun 22 06:25:17 2014 
Sun Jun 29 06:25:24 2014 
Sun Mar 01 06:25:59 2015 
Sun Mar 08 06:25:56 2015 
Sun Mar 15 06:26:08 2015 
Sun Mar 22 06:25:48 2015 
Sun Mar 29 06:25:45 2015 
Sun May 03 06:25:38 2015 
Sun May 04 06:25:18 2014 
Sun May 11 06:25:18 2014 
Sun May 18 06:25:19 2014 
Sun May 25 06:25:17 2014 
Sun Nov 02 06:25:59 2014 
Sun Nov 09 06:25:46 2014 
Sun Nov 16 06:25:38 2014 
Sun Nov 23 06:25:39 2014 
Sun Nov 30 06:25:49 2014 
Sun Oct 05 06:25:53 2014 
Sun Oct 12 06:25:36 2014 
Sun Oct 19 06:25:52 2014 
Sun Oct 26 06:25:57 2014 
Sun Sep 07 06:25:43 2014 
Sun Sep 14 06:25:34 2014 
Sun Sep 21 06:25:35 2014 
Sun Sep 28 06:25:45 2014 
Thu May 15 11:24:37 2014 
Thu May 15 11:24:37 2014 
Thu May 15 11:24:38 2014 
Thu May 15 11:26:29 2014 
Tue Dec 09 09:01:28 2014 

El problema es que las fechas quedan desordenadas porque la salida depende del orden con que se concatenan los archivos. Para lograr ordenar las fechas cronológicamente se requiere re-acomodar las columnas utilizando el formato "año mes día hora":

root@debian:~# (cat /var/log/apache2/*.log; zcat /var/log/apache2/*.gz) | grep "resuming normal operations" | cut -d'[' -f2 | sed -e 's/]//' | awk '{ print $5 " " $2 " " $3 " " $4}' | sort -r
2015 May 08 10:30:36
2015 May 03 06:25:38
2015 Mar 29 06:25:45
2015 Mar 22 06:25:48
2015 Mar 20 16:00:57
2015 Mar 15 06:26:08
2015 Mar 08 06:25:56
2015 Mar 01 06:25:59
2015 Jan 25 06:25:15
2015 Jan 23 20:01:14
2015 Jan 18 06:25:27
2015 Jan 11 06:25:38
2015 Jan 04 06:25:48
2015 Feb 22 06:25:51
2015 Feb 15 06:25:40
2015 Feb 08 06:25:40
2015 Feb 01 06:25:46
2015 Apr 19 06:25:45
2015 Apr 18 10:13:15
2015 Apr 12 06:25:36
2015 Apr 05 06:25:34
2014 Sep 28 06:25:45
2014 Sep 21 06:25:35
2014 Sep 14 06:25:34
2014 Sep 07 06:25:43
2014 Oct 27 10:35:17
2014 Oct 27 10:35:17
2014 Oct 26 06:25:57
2014 Oct 19 06:25:52
2014 Oct 12 06:25:36
2014 Oct 06 08:03:52
2014 Oct 06 08:03:49
2014 Oct 06 08:03:49
2014 Oct 05 06:25:53
2014 Nov 30 06:25:49
2014 Nov 23 06:25:39
2014 Nov 16 06:25:38
2014 Nov 09 06:25:46
2014 Nov 02 06:25:59
2014 May 25 06:25:17
2014 May 18 06:25:19
2014 May 15 11:26:29
2014 May 15 11:24:38
2014 May 15 11:24:37
2014 May 15 11:24:37
2014 May 11 06:25:18
2014 May 04 06:25:18
2014 Jun 29 06:25:24
2014 Jun 22 06:25:17
2014 Jun 15 06:25:18
2014 Jun 08 06:25:18
2014 Jun 01 06:25:21
2014 Jul 27 06:25:25
2014 Jul 20 06:25:27
2014 Jul 13 06:25:31
2014 Jul 06 06:25:43
2014 Dec 28 06:25:44
2014 Dec 21 06:26:08
2014 Dec 14 06:26:04
2014 Dec 13 12:54:44
2014 Dec 09 09:01:28
2014 Dec 07 06:25:47
2014 Dec 05 19:52:15
2014 Dec 05 14:07:07
2014 Aug 31 06:25:19
2014 Aug 24 06:25:19
2014 Aug 17 06:25:16
2014 Aug 15 07:22:50
2014 Aug 10 06:25:38
2014 Aug 04 11:03:50
2014 Aug 03 06:25:19

La opción -r en el comando sort revierte el orden, de esta forma las fechas quedan ordenadas de forma inversa.

Por último, si se desea conocer cuántas veces fue reiniciado, simplemente se debe contar filas:

root@debian:~# (cat /var/log/apache2/*.log; zcat /var/log/apache2/*.gz) | grep "resuming normal operations" | wc -l
71

Es difícil identificar cuáles de estas fechas corresponden con inicios, reinicios y recargas de configuración. Para ello se necesitaría determinar si el mensaje "resuming normal operations" corresponde a un reinicio del servicio por parte del usuario (para el cual debería existir un mensaje "caught SIGTERM, shutting down" previo en el log), inicio del sistema operativo (Apache fue iniciado como parte del proceso de init y puede o no existir un mensaje "caught SIGTERM, shutting down" previo en el log, aunque presumiblemente con una diferencia de algunos minutos como mínimo), o recarga de configuración (para el cual no existe un mensaje "caught SIGTERM, shutting down" inmediatamente anterior en el log).


Tal vez pueda interesarte


Compartí este artículo