Cuando trabajas como Application Support Engineer, Linux se convierte en una de las herramientas más importantes para investigar incidentes en producción ya que aquí es donde la magia se crea.
Un problema puede comenzar con un mensaje tan sencillo como:
“La aplicación está lenta.”
Pero detrás de esa alerta puede existir un filesystem lleno, falta de memoria, un proceso Java consumiendo CPU, problemas de conectividad, errores en logs, certificados vencidos o simplemente un servicio que dejó de responder.
Por eso, estos son algunos de los comandos Linux que considero más útiles en la operación diaria de soporte L3.
1. Verificar el espacio disponible: df
Uno de los primeros comandos que utilizo cuando existe una alerta de filesystem es:
df -h
Permite identificar rápidamente particiones con poco espacio disponible.
También puedes revisar un filesystem específico:
df -h /opt
df -h /var
df -h /tmp
Una partición al 100% puede provocar que una aplicación no pueda generar logs, archivos temporales o incluso iniciar correctamente.
2. Encontrar qué directorios consumen más espacio: du
Después de encontrar un filesystem lleno, necesitamos saber qué está consumiendo el espacio.
du -sh *
Para ordenar los directorios por tamaño:
du -sh * | sort -h
Otra opción muy útil:
du -x /var | sort -n | tail -20
Esto ayuda a localizar logs, dumps, temporales o archivos antiguos que están consumiendo almacenamiento.
3. Encontrar archivos: find
find es indispensable para investigar servidores.
Buscar archivos .log:
find /opt -type f -name "*.log"
Buscar archivos mayores a 1 GB:
find / -type f -size +1G 2>/dev/null
Buscar archivos modificados durante las últimas 24 horas:
find /opt/app -type f -mtime -1
Buscar archivos modificados durante los últimos 30 minutos:
find /opt/app -type f -mmin -30
4. Investigar logs con grep
Probablemente uno de los comandos más utilizados en soporte de aplicaciones.
Buscar errores:
grep -i "error" application.log
Buscar excepciones Java:
grep -i "exception" application.log
Buscar múltiples patrones:
grep -Ei "error|exception|failed|critical" application.log
Mostrar el número de línea:
grep -in "error" application.log
5. Analizar archivos con less
Cuando un log tiene cientos de MB o varios GB, abrirlo con un editor no siempre es buena idea.
less application.log
Dentro de less podemos buscar:
/error
Siguiente coincidencia:
n
Coincidencia anterior:
N
Salir:
q
6. Monitorear logs en tiempo real con tail
Para observar lo que está haciendo una aplicación:
tail -f application.log
Mostrar las últimas 100 líneas:
tail -100 application.log
Combinarlo con grep:
tail -f application.log | grep -i error
Este comando resulta especialmente útil durante deployments, restarts y troubleshooting en producción.
7. Revisar procesos con ps
Para verificar si una aplicación Java está ejecutándose:
ps -ef | grep java
Buscar WebLogic:
ps -ef | grep -i weblogic
Buscar Tomcat:
ps -ef | grep -i tomcat
Una combinación que utilizo frecuentemente es:
ps -ef | grep java | grep -v grep
8. Analizar CPU y memoria con top
Cuando recibimos un incidente indicando que “la aplicación está lenta”, uno de los primeros pasos es revisar los recursos del servidor.
top
Aquí podemos observar:
- CPU utilizada
- memoria
- load average
- procesos
- PID
- tiempo de CPU
También podemos analizar un proceso específico:
top -p PID
9. Revisar memoria con free
Para verificar rápidamente la memoria del servidor:
free -h
Nos permite revisar memoria total, utilizada, disponible y swap.
Es particularmente útil cuando investigamos problemas relacionados con aplicaciones Java.
10. Identificar puertos abiertos con ss
Una aplicación puede estar ejecutándose pero no estar escuchando en el puerto esperado.
ss -lntp
Buscar un puerto específico:
ss -lntp | grep 7001
Por ejemplo, si esperamos que WebLogic escuche en el puerto 7001, este comando permite comprobarlo rápidamente.
En servidores antiguos también podemos encontrar:
netstat -lntp
11. Probar conectividad con curl
En soporte de aplicaciones modernas, curl es indispensable para probar APIs y servicios HTTP.
curl https://server/application
Mostrar headers:
curl -I https://server/application
Mostrar información detallada de la conexión:
curl -v https://server/application
Probar una API:
curl -X GET https://api.example.com/status
Además de HTTP, curl -v puede proporcionar información muy valiosa durante troubleshooting de TLS, certificados, proxies y APIs REST.
12. Probar DNS con nslookup y dig
Muchos problemas aparentemente relacionados con aplicaciones terminan siendo problemas de resolución DNS.
nslookup server.example.com
También podemos utilizar:
dig server.example.com
Una prueba rápida:
dig +short server.example.com
13. Probar conectividad hacia un puerto
Para verificar si un servidor remoto acepta conexiones:
nc -vz server.example.com 443
Otro ejemplo:
nc -vz database.example.com 1521
Esto ayuda a diferenciar rápidamente entre un problema de aplicación y uno de red, firewall o conectividad.
14. Revisar archivos abiertos con lsof
Para saber qué proceso está utilizando un puerto:
lsof -i :8080
También podemos revisar archivos abiertos por un proceso:
lsof -p PID
O encontrar procesos utilizando determinado archivo:
lsof /path/application.log
15. Revisar información de un proceso en /proc
Una de las ventajas de Linux es que podemos investigar directamente información del proceso.
Por ejemplo:
cat /proc/PID/status
Revisar variables de ambiente:
tr '\0' '\n' < /proc/PID/environ
Revisar el comando utilizado para iniciar el proceso:
tr '\0' ' ' < /proc/PID/cmdline
Esto puede ser extremadamente útil investigando aplicaciones Java.
16. Revisar servicios con systemctl
En sistemas modernos basados en systemd:
systemctl status application
Iniciar:
systemctl start application
Detener:
systemctl stop application
Reiniciar:
systemctl restart application
Revisar logs:
journalctl -u application
17. Revisar logs del sistema con journalctl
Consultar eventos recientes:
journalctl -xe
Logs de un servicio:
journalctl -u application.service
Últimas 100 líneas:
journalctl -u application.service -n 100
Seguir los eventos en tiempo real:
journalctl -u application.service -f
18. Buscar información histórica con history
Durante un incidente también puede ser útil saber qué comandos fueron ejecutados recientemente:
history
Buscar comandos relacionados con una aplicación:
history | grep weblogic
Buscar reinicios:
history | grep restart
Naturalmente, el historial disponible dependerá de la configuración del shell y del usuario.
19. Verificar quién está conectado al servidor
who
También:
w
Y para revisar accesos anteriores:
last
Esto puede ser útil cuando varias personas están trabajando simultáneamente durante un incidente crítico.
20. Analizar archivos con awk
awk es extremadamente útil para procesar logs y resultados de comandos.
Por ejemplo, obtener la quinta columna:
awk '{print $5}' archivo.log
En archivos CSV:
awk -F',' '{print $5}' archivo.csv
También podemos combinarlo con otros comandos:
ps -ef | awk '{print $1,$2,$8}'
21. Procesar texto con sed
Por ejemplo, reemplazar texto:
sed 's/ERROR/WARNING/g' archivo.txt
Mostrar determinadas líneas:
sed -n '100,120p' application.log
sed, awk y grep forman una combinación extremadamente poderosa para analizar grandes cantidades de información.
22. Ordenar y contar resultados
Comandos como sort, uniq y wc son muy útiles durante troubleshooting.
sort archivo.txt
Contar líneas:
wc -l archivo.log
Contar valores únicos:
sort archivo.txt | uniq -c
Ordenarlos por frecuencia:
sort archivo.txt | uniq -c | sort -nr
Esto puede ayudarnos, por ejemplo, a encontrar los errores que aparecen con mayor frecuencia.
23. Revisar conexiones de red
ss -ant
Podemos analizar conexiones hacia un puerto:
ss -ant | grep :443
O contar conexiones por estado:
ss -ant | awk '{print $1}' | sort | uniq -c
Muy útil cuando investigamos problemas de saturación o conectividad.
24. Revisar certificados SSL/TLS con openssl
En ambientes empresariales, muchos incidentes están relacionados con certificados.
Consultar un servidor:
openssl s_client -connect server.example.com:443
Mostrar información del certificado:
openssl s_client -connect server.example.com:443 </dev/null 2>/dev/null |
openssl x509 -noout -subject -issuer -dates
Esto permite revisar rápidamente el subject, issuer y fechas de validez.
25. Revisar carga del servidor con uptime
Un comando sencillo pero extremadamente útil:
uptime
Además del tiempo que lleva encendido el servidor, muestra el load average de los últimos 1, 5 y 15 minutos.
Un escenario real de troubleshooting L3
Supongamos que recibimos el incidente:
“La aplicación de producción no responde.”
En lugar de reiniciar inmediatamente el servicio, podemos investigar:
1. ¿El servidor tiene recursos?
uptime
free -h
df -h
top
2. ¿La aplicación está ejecutándose?
ps -ef | grep java
3. ¿Está escuchando en el puerto?
ss -lntp | grep 8080
4. ¿Responde localmente?
curl -v http://localhost:8080/application
5. ¿Qué dicen los logs?
tail -100 application.log
grep -Ei "error|exception|failed" application.log
6. ¿Existe conectividad con las dependencias?
nc -vz database-server 1521
nc -vz api-server 443
7. ¿Existe algún problema DNS?
dig api-server.example.com
Con unos cuantos comandos podemos comenzar a determinar si estamos frente a un problema de aplicación, JVM, filesystem, memoria, CPU, red, DNS, base de datos o servicio externo.
Cheat Sheet — Linux para Application Support L3
FILESYSTEM
df -h
du -sh *
find / -type f -size +1G
LOGS
tail -f application.log
less application.log
grep -Ei "error|exception|failed" application.log
PROCESSES
ps -ef | grep java
top
free -h
NETWORK
ss -lntp
nc -vz host port
dig hostname
HTTP / APIs
curl -v URL
curl -I URL
SERVICES
systemctl status service
journalctl -u service
SSL/TLS
openssl s_client -connect host:443
TEXT PROCESSING
grep
awk
sed
sort
uniq
wc
SERVER
uptime
who
w
last
Conclusión
Trabajar como Application Support Engineer no significa simplemente reiniciar servicios cuando algo falla.
El verdadero trabajo consiste en recopilar evidencia, correlacionar logs, analizar procesos, revisar recursos, validar conectividad y encontrar la causa raíz del problema.
Después de años trabajando con Linux, middleware, aplicaciones Java, APIs, bases de datos y ambientes distribuidos, comandos aparentemente sencillos como grep, find, ps, top, curl, ss, awk y tail terminan convirtiéndose en algunas de las herramientas más importantes para resolver incidentes críticos.
Dominar Linux no significa memorizar cientos de comandos.
Significa saber qué comando utilizar cuando producción está fallando y necesitas descubrir por qué.
