Tienes problemas para iniciar httpd y no hay errores en los logs?, Tienes otro programa que que se congela y no tienes ni idea de que pueda estar pasando? es buen momento para empezar a usar strace.

Strace es una utilidad que se usa para correr un comando y visualizar todas sus interacciones con el sistema de forma que puedes ver exactamente que esta haciendo el programa desde que inicia hasta que sale incluso puede ser usado para hacer pruebas de rendimiento y estabilidad. En este articulo lo usaremos solo como una herramienta de diagnostico para ver por que un programa se congela.

El comando strace es fácil de usar, simplemente ejecuta strace al iniciar el servicio o programa que deseas diagnosticar, por ejemplo:

strace date

Esto te debería de dar una salida de bastantes lineas en el terminal. Veamos que pasa cuando una aplicación da error, intentemos correr man sin ningún parámetro.

$ man What manual page do you want?

Ahora veamos que hace man para llegar a ese mensaje:

execve("/usr/bin/man", ["man"], [/* 23 vars */]) = 0 brk(0)                                  = 0x9e89000
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7869000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=24131, ...}) = 0 ...
open("/usr/share/locale/en_US.UTF-8/man", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/man", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en/man", O_RDONLY) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=5830, ...}) = 0
mmap2(NULL, 5830, PROT_READ, MAP_PRIVATE, 4, 0) = 0xb7865000
close(4)                                = 0
write(2, "What manual page do you want?\n", 30) = 30 ...

Gracias a que man dio como salida "What manual page do you want?" sabemos cual es el error, pero si no nos hubiese dado este mensaje, como sabemos lo que esta pasando? aquí es cuando strace nos ayuda. La salida del strace es mucho mas larga que el párrafo que tenemos arriba pero lo recorte solo para mostrar lo que nos interesa en este ejemplo. Si se fijan el error "-1 ENOENT (No such file or directory)" se repite unas tres veces esto en algunos casos es un indicativo de lo que puede estar pasando.

Identificar los errores es relativamente fácil, por lo general tienen un -1 como salida y no todos los errores son fatales pero nos pueden dar pistas de lo que este mal con el programa

Algunos paramentos interesantes Puedes usar -u seguido del nombre del usuario para ejecutarlo como ese usuario en especifico cosa que es ideal para identificar correctamente problemas de permisos y lo mas seguro es que estés corriendo strace como root pero la mayoría de los servicios tienen sus propios usuarios para correr.

El parámetro -p seguido del PID es útil cuando el proceso que queremos examinar ya esta corriendo.

Personalmente suelo correrlo con estos parámetros:

strace -f -F -v -s 8192  -o <archivo>
  • -f Permite hacerle strace a los posibles forks que haga un programa, por ejemplo httpd.
  • -F Cumple la misma función que -f pero siempre lo pongo por cuestión de costumbre.
  • -v Nos da una salida detallada.
  • -s 8192 Asigno el valor de 8192 como limite de longitud de las cadenas que se van a imprimir. Por defecto es 32 y yo quiero la mayor cantidad de información posible.
  • -o La salida va a ser redirigida a un archivo.