En un mundo lleno de nuevas herramientas y diversos entornos de desarrollo, es prácticamente una necesidad para cualquier desarrollador o ingeniero aprender algunos comandos básicos de administrador de sistemas. Los comandos y paquetes específicos pueden ayudar a los desarrolladores a organizar, solucionar problemas y optimizar sus aplicaciones y, cuando las cosas salen mal, proporcionar valiosa información de clasificación a los operadores y administradores de sistemas.
Ya sea que sea un desarrollador nuevo o quiera administrar su propia aplicación, los siguientes 20 comandos básicos de administrador del sistema pueden ayudarlo a comprender mejor sus aplicaciones. También pueden ayudarlo a describir problemas a los administradores de sistemas para solucionar por qué una aplicación puede funcionar localmente pero no en un host remoto. Estos comandos se aplican a entornos de desarrollo de Linux, contenedores, máquinas virtuales (VM) y máquinas sin hardware.
curl
curl transfiere una URL. Utilice este comando para probar el punto final de una aplicación o la conectividad con un punto final de servicio ascendente. curl puede ser útil para determinar si su solicitud puede llegar a otro servicio, como una base de datos, o para verificar si su servicio está en buen estado.
Como ejemplo, imagine que su aplicación arroja un error HTTP 500 que indica que no puede llegar a una base de datos MongoDB:
$ curl -I -s myapplication:5000
HTTP/1.0 500 INTERNAL SERVER ERROR
La opción-I muestra la información del encabezado y la opción-s silencia el cuerpo de la respuesta. Comprobación del punto final de la base de datos desde el escritorio local:
$ curl -I -s database:27017
HTTP/1.0 200 OK
Entonces, ¿cuál podría ser el problema? Compruebe si su aplicación puede llegar a otros lugares además de la base de datos desde el host de la aplicación:
$ curl -I -s https://opensource.com
HTTP/1.1 200 OK
Eso parece estar bien. Ahora intente llegar a la base de datos desde el host de la aplicación. Tu aplicación está usando el nombre de host de la base de datos, así que prueba eso primero:
$ curl database:27017
curl: (6) Couldn't resolve host 'database'
Esto indica que la aplicación no puede resolver la base de datos porque la URL de la base de datos no está disponible o el host (contenedor o máquina virtual) no tiene un servidor de nombres que pueda usar para resolver el nombre de host.
python-m json.tool / jq
Después de emitir curl, el resultado de la llamada a la API puede ser difícil de leer. A veces, desea imprimir de forma bonita la salida JSON para encontrar una entrada específica. Python tiene una biblioteca JSON incorporada que puede ayudar con esto. Se usa python-m json.herramienta para sangrar y organizar el JSON. Para usar el módulo JSON de Python, canalice la salida de un archivo JSON al json de python-m.comando de herramientas.
$ cat test.json
{"title":"Person","type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"age":{"description":"Age in years","type":"integer","minimum":0}},"required":}
Para usar la biblioteca de Python, canalice la salida a Python con la opción-m (módulo).
$ cat test.json | python -m json.tool
{
"properties": {
"age": {
"description": "Age in years",
"minimum": 0,
"type": "integer"
},
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
}
},
"required": ,
"title": "Person",
"type": "object"
}
Para un análisis JSON más avanzado, puede instalar jq. jq proporciona algunas opciones que extraen valores específicos de la entrada JSON. Para imprimir de forma bonita como el módulo de Python anterior, simplemente aplique jq a la salida.
$ cat test.json | jq
{
"title": "Person",
"type": "object",
"properties": {
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"age": {
"description": "Age in years",
"type": "integer",
"minimum": 0
}
},
"required":
}
ls
ls lista archivos en un directorio. Los administradores de sistemas y desarrolladores emiten este comando con bastante frecuencia. En el espacio contenedor, este comando puede ayudar a determinar el directorio y los archivos de la imagen del contenedor. Además de buscar sus archivos, ls puede ayudarlo a examinar sus permisos. En el siguiente ejemplo, no puede ejecutar myapp debido a un problema de permisos. Cuando comprueba los permisos usando ls-l, se da cuenta de que los permisos no tienen una «x» en-rw-r r r., que son de lectura y escritura solamente.
$ ./myapp
bash: ./myapp: Permission denied
$ ls -l myapp
-rw-r--r--. 1 root root 33 Jul 21 18:36 myapp
tail
tail muestra la última parte de un archivo. Por lo general, no necesita todas las líneas de registro para solucionar problemas. En su lugar, desea verificar lo que dicen sus registros sobre la solicitud más reciente a su aplicación. Por ejemplo, puede usar tail para comprobar lo que sucede en los registros cuando realiza una solicitud a su servidor HTTP Apache.
ejemplo: cola.png
Use tail-f para seguir los registros HTTP de Apache y ver las solicitudes a medida que suceden.
La opción-f indica la opción «seguir», que muestra las líneas de registro a medida que se escriben en el archivo. El ejemplo tiene un script en segundo plano que accede al extremo cada pocos segundos y el registro registra la solicitud. En lugar de seguir el registro en tiempo real, también puede usar tail para ver las últimas 100 líneas del archivo con la opción-n.
$ tail -n 100 /var/log/httpd/access_log
cat
cat concatena e imprime archivos. Puede emitir cat para comprobar el contenido de su archivo de dependencias o para confirmar la versión de la aplicación que ya ha creado localmente.
$ cat requirements.txt
flask
flask_pymongo
El ejemplo anterior comprueba si su aplicación Python Flask tiene Flask listado como dependencia.
grep
grep busca patrones de archivos. Si está buscando un patrón específico en la salida de otro comando, grep resalta las líneas relevantes. Utilice este comando para buscar archivos de registro, procesos específicos y más. Si desea ver si Apache Tomcat se inicia, es posible que se sienta abrumado por el número de líneas. Al canalizar esa salida al comando grep, aísla las líneas que indican el inicio del servidor.
$ cat tomcat.log | grep org.apache.catalina.startup.Catalina.start
01-Jul-2017 18:03:47.542 INFO org.apache.catalina.startup.Catalina.start Server startup in 681 ms
ps
El comando ps, parte del paquete procps-ng que proporciona comandos útiles para investigar los ID de proceso, muestra el estado de un proceso en ejecución. Utilice este comando para determinar una aplicación en ejecución o confirmar un proceso esperado. Por ejemplo, si desea comprobar si hay un servidor web Tomcat en ejecución, utilice ps con sus opciones para obtener el ID de proceso de Tomcat.
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 2 18:55 ? 00:00:02 /docker-java-home/jre/bi
root 59 0 0 18:55 pts/0 00:00:00 /bin/sh
root 75 59 0 18:57 pts/0 00:00:00 ps -ef
Para una legibilidad aún mayor, use ps y canaléelo a grep.
$ ps -ef | grep tomcat
root 1 0 1 18:55 ? 00:00:02 /docker-java-home/jre/bi
env
env le permite configurar o imprimir las variables de entorno. Durante la resolución de problemas, puede resultar útil para comprobar si la variable de entorno incorrecta impide que se inicie la aplicación. En el ejemplo siguiente, este comando se utiliza para comprobar las variables de entorno establecidas en el host de la aplicación.
$ env
PYTHON_PIP_VERSION=9.0.1
HOME=/root
DB_NAME=test
PATH=/usr/local/bin:/usr/local/sbin
LANG=C.UTF-8
PYTHON_VERSION=3.4.6
PWD=/
DB_URI=mongodb://database:27017/test
Observe que la aplicación está utilizando Python y tiene variables de entorno para conectarse a una base de datos MongoDB.
top
top muestra y actualiza la información del proceso ordenada. Utilice esta herramienta de supervisión para determinar qué procesos se están ejecutando y cuánta memoria y CPU consumen. Un caso común ocurre cuando se ejecuta una aplicación y muere un minuto después. Primero, comprueba el error de retorno de la aplicación, que es un error de memoria.
$ tail myapp.log
Traceback (most recent call last):
MemoryError
¿Su aplicación está realmente sin memoria? Para confirmar, use top para determinar la cantidad de CPU y memoria que consume la aplicación. Al emitir top, nota que una aplicación Python utiliza la mayor parte de la CPU, con un uso de memoria que aumenta, y sospecha que es su aplicación. Mientras se ejecuta, pulsa la tecla» C » para ver el comando completo y realizar ingeniería inversa si el proceso es tu aplicación. Resulta ser su aplicación que consume mucha memoria (memeater.py). Cuando la aplicación se ha quedado sin memoria, el sistema la mata con un error de falta de memoria (OOM).
example_top.png
El uso de memoria y CPU de la aplicación aumenta, y finalmente se elimina OOM.
example_topwithc.png
Al presionar la tecla» C», puede ver el comando completo que inició la aplicación.
Además de comprobar su propia aplicación, puede usar top para depurar otros procesos que utilizan CPU o memoria.
netstat
netstat muestra el estado de la red. Este comando muestra los puertos de red en uso y sus conexiones entrantes. Sin embargo, netstat no viene de fábrica en Linux. Si necesita instalarlo, puede encontrarlo en el paquete net-tools. Como desarrollador que experimenta localmente o envía una aplicación a un host, es posible que reciba un error de que un puerto ya está asignado o una dirección ya está en uso. El uso de netstat con opciones de protocolo, proceso y puerto demuestra que el servidor HTTP Apache ya utiliza el puerto 80 en el host siguiente.
example_netstat.png
El uso de netstat-tulpn muestra que Apache ya utiliza el puerto 80 en esta máquina.
ip
Si la dirección ip no funciona en tu host, debe ser instalado con el paquete iproute2. La dirección del subcomando (o simplemente ip a para abreviar) muestra las interfaces y direcciones IP del host de su aplicación. Utiliza la dirección IP para verificar la dirección IP de su contenedor o host. Por ejemplo, cuando el contenedor está conectado a dos redes, la dirección ip puede mostrar qué interfaz se conecta a qué red. Para una comprobación sencilla, siempre puede usar el comando dirección ip para obtener la dirección IP del host. El siguiente ejemplo muestra que el contenedor de nivel web tiene una dirección IP de 172.17.0.2 en la interfaz eth0.
$ ip address show eth0
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether d4:3b:04:9e:b2:c2 brd ff:ff:ff:ff:ff:ff
inet 10.1.1.3/27 brd 10.1.1.31 scope global dynamic noprefixroute eth0
valid_lft 52072sec preferred_lft 52072sec
lsof
lsof enumera los archivos abiertos asociados a su aplicación. En algunas imágenes de máquinas Linux, necesita instalar lsof con el paquete lsof. En Linux, casi cualquier interacción con el sistema se trata como un archivo. Como resultado, si su aplicación escribe en un archivo o abre una conexión de red, lsof reflejará esa interacción como un archivo. Al igual que netstat, puede usar lsof para verificar si hay puertos de escucha. Por ejemplo, si desea comprobar si el puerto 80 está en uso, utilice lsof para comprobar qué proceso lo está utilizando. A continuación, puede ver que httpd (Apache) escucha en el puerto 80. También puede usar lsof para verificar el ID de proceso de httpd, examinando dónde reside el binario del servidor web (/usr/sbin / httpd).
example_lsof.png
Lsof muestra que httpd escucha en el puerto 80. Al examinar el ID de proceso de httpd también se muestran todos los archivos que httpd necesita para ejecutarse.
El nombre del archivo abierto en la lista de archivos abiertos ayuda a identificar el origen del proceso, específicamente de Apache.
df
Puede usar df (mostrar espacio libre en disco) para solucionar problemas de espacio en disco. Cuando ejecuta la aplicación en un orquestador de contenedores, es posible que reciba un mensaje de error que indica la falta de espacio libre en el host del contenedor. Si bien un administrador de sistemas debe administrar y optimizar el espacio en disco, puede usar df para averiguar el espacio existente en un directorio y confirmar si realmente se encuentra sin espacio.
$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 7.7G 0 7.7G 0% /dev
/dev/mapper/RHEL-Root 50G 16G 35G 31% /
/dev/nvme0n1p2 3.0G 246M 2.8G 9% /boot
/dev/mapper/RHEL-Home 100G 88G 13G 88% /home
/dev/nvme0n1p1 200M 9.4M 191M 5% /boot/efi
/dev/sdb1 114G 55G 54G 51% /run/media/tux/red
La opción-h imprime la información en un formato legible por humanos. De forma predeterminada, como en el ejemplo, df proporciona resultados para todo lo que se encuentra bajo el directorio raíz, pero también puede limitar los resultados proporcionando un directorio como parte de su comando (como df-h /home).
du
Para obtener información más detallada sobre qué archivos utilizan el espacio en disco de un directorio, puede utilizar el comando du. Si desea averiguar qué registro ocupa más espacio en el directorio / var / log, por ejemplo, puede usar du con la opción-h (legible por humanos) y la opción-s para el tamaño total.
$ du -sh /var/log/*
1.8M /var/log/anaconda
384K /var/log/audit
4.0K /var/log/boot.log
0 /var/log/chrony
4.0K /var/log/cron
4.0K /var/log/maillog
64K /var/log/messages
El ejemplo anterior revela que el directorio más grande en /var/log es /var / log / audit. Puede usar du junto con df para determinar qué utiliza el espacio en disco del host de su aplicación.
id
Para comprobar el usuario que ejecuta la aplicación, utilice el comando id para devolver la identidad del usuario. El siguiente ejemplo utiliza Vagrant para probar la aplicación y aislar su entorno de desarrollo. Después de iniciar sesión en el cuadro Vagrant, si intenta instalar el servidor HTTP Apache (una dependencia), el sistema indica que no puede ejecutar el comando como root. Para comprobar el usuario y el grupo, ejecute el comando id y observe que se está ejecutando como usuario «vagabundo» en el grupo «vagabundo».
$ dnf -y install httpd
Loaded plugins: fastestmirror
You need to be root to perform this command.
$ id
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Para corregir esto, debe ejecutar el comando como superusuario, que proporciona privilegios elevados.
chmod
Cuando ejecuta el binario de su aplicación por primera vez en su host, puede recibir el mensaje de error «permiso denegado.»Como se ve en el ejemplo de ls, puede verificar los permisos de su binario de aplicación.
$ ls -l
total 4
-rw-rw-r--. 1 vagrant vagrant 34 Jul 11 02:17 test.sh
Esto muestra que no tiene derechos de ejecución (sin» x») para ejecutar el binario. chmod puede corregir los permisos para permitir que el usuario ejecute el binario.
$ chmod +x test.sh
$ ls -l
total 4
-rwxrwxr-x. 1 vagrant vagrant 34 Jul 11 02:17 test.sh
Como se muestra en el ejemplo, esto actualiza los permisos con derechos de ejecución. Ahora, cuando intenta ejecutar su binario, la aplicación no genera un error de denegación de permiso. Chmod también puede ser útil cuando carga un binario en un contenedor. Garantiza que el contenedor tenga los permisos correctos para ejecutar el binario.
dig / nslookup
Un servidor de nombres de dominio (DNS) ayuda a resolver una URL a un conjunto de servidores de aplicaciones. Sin embargo, es posible que una URL no se resuelva, lo que causa un problema de conectividad para su aplicación. Por ejemplo, supongamos que intenta acceder a su base de datos en la URL de mydatabase desde el host de su aplicación. En su lugar, recibe un error «no se puede resolver». Para solucionar problemas, intente usar dig (utilidad de búsqueda de DNS) o nslookup (consulta de servidores de nombres de Internet) para averiguar por qué la aplicación parece no poder resolver la base de datos.
$ nslookup mydatabase
Server: 10.0.2.3
Address: 10.0.2.3#53
** server can't find mydatabase: NXDOMAIN
El uso de nslookup muestra que mydatabase no se puede resolver. Tratar de resolver con dig produce el mismo resultado.
$ dig mydatabase
; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7_3.1 <<>> mydatabase
;; global options: +cmd
;; connection timed out; no servers could be reached
Estos errores pueden ser causados por muchos problemas diferentes. Si no puede depurar la causa raíz, póngase en contacto con su administrador del sistema para más investigación. Para las pruebas locales, este problema puede indicar que los servidores de nombres de su host no están configurados adecuadamente. Para usar estos comandos, necesitará instalar el paquete BIND Utilities.
firewall-cmd
Tradicionalmente, los firewalls se configuraban en Linux con el comando iptables, y aunque conserva su ubicuidad, en realidad ha sido reemplazado en gran medida por nftables. Un front-end amigable para nftables, y el que viene con muchas distribuciones por defecto, es firewall-cmd. Este comando le ayuda a configurar las reglas que rigen el tráfico de red, tanto saliente como entrante, que permite su computadora. Estas reglas se pueden agrupar en zonas, para que pueda pasar de un conjunto de reglas a otro de forma rápida y sencilla, según sus requisitos.
La sintaxis de comandos es sencilla. Se utiliza el comando y un cierto número de opciones, todas las cuales están nombradas de manera que casi le ayudan a construir una oración legible para el ser humano. Por ejemplo, para ver en qué zona se encuentra actualmente:
$ sudo firewall-cmd --get-active-zones``
corp
interfaces: ens0
dmz
interfaces: ens1
En este ejemplo, el equipo tiene dos dispositivos de red, uno asignado a la zona corp
y el otro a la zona dmz
.
Para ver lo que permite cada zona, puede usar la opción --list-all
:
$ sudo firewall-cmd --zone corp --list-all
corp
target: default
interfaces: ens0
services: cockpit dhcpv6-client ssh
ports:
protocols:
Añadir servicios es igual de fácil:
$ sudo firewall-cmd --add-service http --permanent
$ sudo firewall-cmd --reload
Interactuar con firewall-cmd está diseñado para ser intuitivo, y tiene una amplia colección de servicios predefinidos, además de la capacidad de escribir reglas nft directamente. Una vez que comience a usar firewall-cmd, puede descargar nuestra hoja de trucos de firewall-cmd para ayudarlo a recordar sus opciones más importantes.
sestatus
Normalmente encontrará SELinux (un módulo de seguridad de Linux) aplicado en un host de aplicación administrado por una empresa. SELinux proporciona acceso de privilegios mínimos a los procesos que se ejecutan en el host, evitando que procesos potencialmente maliciosos accedan a archivos importantes en el sistema. En algunas situaciones, una aplicación necesita acceder a un archivo específico, pero puede generar un error. Para comprobar si SELinux bloquea la aplicación, use tail y grep para buscar un mensaje «denegado» en el registro /var/log/audit. De lo contrario, puede verificar si la casilla tiene SELinux activado usando sestatus.
$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28
La salida anterior indica que el host de la aplicación tiene SELinux habilitado. En su entorno de desarrollo local, puede actualizar SELinux para que sea más permisivo. Si necesita ayuda con un host remoto, su administrador de sistemas puede ayudarlo a determinar las mejores prácticas para permitir que su aplicación acceda al archivo que necesita. Si está interactuando con SELinux con frecuencia, descargue nuestra hoja de trucos de SELinux para una referencia rápida.
historial
Cuando emite tantos comandos para probar y depurar, ¡puede olvidar los útiles! Cada shell tiene una variante del comando history. Muestra el historial de comandos que ha emitido desde el inicio de la sesión. Puede usar el historial para registrar los comandos que utilizó para solucionar problemas de la aplicación. Por ejemplo, cuando emite el historial a lo largo de este artículo, muestra los diversos comandos con los que experimentó y aprendió.
$ history
1 clear
2 df -h
3 du
¿Qué pasa si desea ejecutar un comando en su historial anterior, pero no desea volver a escribirlo? ¡Usa ! antes del número de comando a ejecutar de nuevo.
example_history.png
Agregar ! antes de que el número de comando que desea ejecutar emita de nuevo el comando.
Los comandos básicos pueden mejorar su experiencia en solución de problemas a la hora de determinar por qué su aplicación funciona en un entorno de desarrollo, pero quizás no en otro. Muchos administradores de sistemas aprovechan estos comandos para depurar problemas con los sistemas. Comprender algunos de estos útiles comandos de solución de problemas puede ayudarlo a comunicarse con los administradores del sistema y resolver problemas con su aplicación.
Este artículo se publicó originalmente en julio de 2017 y ha sido actualizado por el editor.