– Este sí que es un caso misterioso. ¿Qué cree usted que hay detrás de esto?
– No poseo todavía datos. Constituye un craso error el teorizar sin poseer datos. Uno empieza de manera insensible a retorcer los hechos para acomodarlos a sus hipótesis, en vez de acomodar las hipótesis a los hechos.
Sherlock Holmes al Dr. Watson en Un escándalo en Bohemia – Sir Arthur Conan Doyle
En días pasados, en varios foros linuxeros que visito con regularidad (incluso dentro de algunos grupos de Google+ y Facebook), he visto varios mensajes donde solicitan apoyo con diferentes aplicaciones con un denominador común:
“Al dar clic en el icono de la aplicación […] no abre nada y no manda mensaje de error, me pueden ayudar? “
Después se molestan porque varios usuarios les contestan con el clásico RTFM:
Obviamente, la comunidad del Software Libre ha prosperado gracias al apoyo incesante entre sus miembros, ávidos por compartir el conocimiento… pero vamos!! Al menos hay que demostrar un mínimo esfuerzo de haber realizado una investigación acerca de la solución.
Siempre he creído que algo que nos caracteriza, es la búsqueda incesante del saber como funcionan las cosas.
Cada uno tiene su propio método de analizar cuando se presentan fallas, en este post quiero compartirles el mío:
NOTA: Antes que nada, busco en internet el error tal cual me aparece en la consola, log, etc; ya sea en Google, en la base de conocimientos de Red Hat, o en algún foro especializado, además de los sitios que en cada post recomiendo (nixCraft, The Geek Stuff, HowtoForge y systemadmin.es) y los que pueden encontrar en la sección derecha del blog.
1. Checar el mensaje de error en la terminal
Básico. Al ejecutar cualquier programa en Linux desde la terminal, nos mostrará si corrió bien, en caso contrario, tendremos un indicio de lo que falló:
En este ejemplo, al ejecutar spotify nos indica que no encuentra una librería en particular, la cual podríamos buscar con yum:
[root@hobbiton ~]# yum provides libQtGui.so.4 Loaded plugins: langpacks, refresh-packagekit updates/20/x86_64/metalink | 14 kB 00:00:00 1:qt-x11-4.8.6-10.fc20.i686 : Qt GUI-related libraries Repo : updates Matched from: Provides : libQtGui.so.4 [root@hobbiton ~]#
Después de instalar el paquete, volvemos a ejecutar el launcher de la aplicación:
[root@hobbiton ~]# spotify /usr/local/lib/spotify-client/spotify: error while loading shared libraries: libXss.so.1: cannot open shared object file: No such file or directory [root@hobbiton ~]#
Esto puede llegar a ser un proceso muy largo de esta manera, entonces, utilizaremos un comando que nos ayudara a validar que el binario cuente con todas las dependencias necesarias:
2. ldd (list dynamic dependencies)
Con esta herramienta podemos verificar si nuestro binario en cuestión cuenta con todas las dependencias necesarias para ejecutarse:
[root@hobbiton ~]# ldd /usr/local/lib/spotify-client/spotify | grep "not found" /usr/local/lib/spotify-client/spotify: /usr/local/lib/spotify-client/libssl.so.1.0.0: version `OPENSSL_1.0.0' not found (required by /usr/local/lib/spotify-client/spotify) /usr/local/lib/spotify-client/spotify: /usr/local/lib/spotify-client/libcrypto.so.1.0.0: version `OPENSSL_1.0.0' not found (required by /usr/local/lib/spotify-client/spotify) libXss.so.1 => not found [root@hobbiton ~]#
Ya con esto podríamos buscar e instalar todos los paquetes que cumplan con las dependencias necesarias y ejecutar nuestro binario:
Si la falla implica algún servicio de red, verificamos si el puerto en cuestión esta siendo utilizado y que proceso lo utiliza:
3. netstat (network statistics)
[root@hobbiton ~]# netstat -anp | grep spotify tcp 0 0 127.0.0.1:4371 0.0.0.0:* LISTEN 2821/spotify tcp 0 0 0.0.0.0:57621 0.0.0.0:* LISTEN 2821/spotify tcp 0 0 127.0.0.1:4381 0.0.0.0:* LISTEN 2821/spotify tcp 0 0 127.0.0.1:8099 0.0.0.0:* LISTEN 2821/spotify tcp 0 0 192.168.122.122:53395 178.236.4.227:443 ESTABLISHED 2821/spotify tcp 0 0 192.168.122.122:49229 54.230.4.100:443 ESTABLISHED 2821/spotify tcp 0 0 192.168.122.122:60232 50.18.187.163:443 ESTABLISHED 2821/spotify tcp 0 0 192.168.122.122:34614 54.230.6.66:443 ESTABLISHED 2821/spotify tcp 0 200 192.168.122.122:54652 54.230.5.149:80 ESTABLISHED 2821/spotify tcp 0 0 192.168.122.122:54651 54.230.5.149:80 ESTABLISHED 2821/spotify udp 0 0 0.0.0.0:57621 0.0.0.0:* 2821/spotify [root@hobbiton ~]#
Esta revisión es de forma interna, dentro del equipo que esta ejecutando el servicio o la aplicación. Si el servicio/aplicación, tuviera que publicarse, tendríamos que revisarlo de forma externa:
4. nmap (network mapper)
Existen muchas combinaciones y ejemplos de lo poderosa que puede llegar a ser esta herramienta, para cuestiones rápidas, la ejecutamos como:
[root@isengard ~]# nmap -PN 192.168.122.122 Starting Nmap 6.45 ( http://nmap.org ) at 2014-08-02 16:38 CDT Nmap scan report for 192.168.122.122 Host is up (0.00023s latency). Not shown: 999 filtered ports PORT STATE SERVICE 22/tcp open ssh MAC Address: 52:54:00:DB:A9:AA (QEMU Virtual NIC) Nmap done: 1 IP address (1 host up) scanned in 7.62 seconds [root@isengard ~]#
Si requerimos conocer si algún binario esta en uso, usamos la herramienta:
5. lsof (list open files)
[root@hobbiton ~]# lsof /usr/local/lib/spotify-client/spotify lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs Output information may be incomplete. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME spotify 2821 alex.callejas txt REG 253,0 28871528 405137 /usr/local/lib/spotify-client/spotify spotify 2832 alex.callejas txt REG 253,0 28871528 405137 /usr/local/lib/spotify-client/spotify [root@hobbiton ~]#
Si requerimos de conocer el funcionamiento del binario, para identificar alguna falla, podemos utilizar:
6. strace (system call tracer)
[root@hobbiton ~]# strace ls
Como la herramienta hace una traza a las llamadas del sistema para poder ejecutar el binario, la salida es muy grande, si la quieren checar, den clic aquí.
También nos puede resultar provechoso el conocer el contenido del binario, para esto, usamos las herramientas:
7. strings
Este comando busca e imprime en pantalla las cadenas de texto que encuentra embebidos dentro de los binarios:
[root@hobbiton ~]# strings /usr/bin/ls
8. hexdump
La salida de este comando imprime una representación visible de todos los bites de un archivo:
[root@hobbiton ~]# hexdump -C /usr/bin/ls
Con ayuda de estas herramientas podríamos encontrar cual es la fuente de falla de nuestra aplicación/servicio y poderla solucionar para que funcione correctamente.
Estas herramientas son las que considero mi navaja suiza, espero les sirvan…