Coffee bytes

Apuntes de desarrollo web con GNU/Linux, Python y Javascript

Comandos de Linux que deberías conocer (tercera parte)

El lunes, 20 de mayo de 2019

por Eduardo Zepeda

Tiempo de lectura: 19 minutos

Esta es la tercera parte de la lista de los comandos que más utilizo de GNU/Linux. Si quieres ver las dos primeras partes de esta serie de entradas por favor haz click aquí para la primera parte o click acá para la segunda parte.

printenv

Printenv va a imprimir una serie de igualdades conocidas como variables de entorno, y sus valores correspondientes. Estas variables describen el entorno en que corre un programa e influyen en como se comporta nuestro sistema operativo. Las variables de entorno están disponibles para ser leídas por cualquier aplicación de nuestro sistema, por lo que podemos usarlas para guardar información tal como nombres de usuario, valores de configuración, rutas a archivos, etc.

printenv
--...
--XDG_MENU_PREFIX=gnome-
--LANG=es_MX.UTF-8
--GDM_LANG=es_MX.UTF-8
--DISPLAY=:0
--...

El comando printenv también nos permite acceder al valor de una variable en particular, pasándosela como argumento

printenv LANG
--es_MX.UTF-8

export

Export nos permite crear una variable de entorno. Esta variable de entorno va a estar disponible durante nuestra sesión en la terminal. Al cerrar la terminal la variable desaparece.

export MI_VARIABLE=mi_valor
printenv MI_VARIABLE
--mi_valor

top

El comando top nos muestra la lista de procesos o hilos que están ejecutándose en tiempo real e información relativa a cada uno de estos. Mira abajo como están ordenados lor procesos, primero están los procesos del usuario actual y luego sigue una lista de los procesos ordenados por su identificador de proceso (PID), si presionas la tecla abajo ↓ te mostrará más procesos. Puedes presionar en cualquier momento la tecla ‘q‘ para abandonar la pantalla interactiva y regresar a la terminal.

top 
--  top - 11:22:06 up  2:29,  1 user,  load average: 0.57, 0.86, 1.00
--  Tasks: 214 total,   1 running, 213 sleeping,   0 stopped,   0 zombie
--  %Cpu(s): 14.7 us,  2.8 sy,  0.1 ni, 81.1 id,  1.1 wa,  0.0 hi,  0.2 si,  0.0 st
--  KiB Mem :  8111064 total,  3577672 free,  2705236 used,  1828156 buff/cache
--  KiB Swap: 11717628 total, 11717628 free,        0 used.  4961212 avail Mem 
-- 
--  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                   
-- 10306 usuario   20   0   45064   3644   2984 R  12.5  0.0   0:00.02 top                                                                                                                       
--  1657 usuario   20   0 2433020 186960  84944 S   6.2  2.3   6:45.07 gnome-shell                                                                                                               
--  1689 usuario    9 -11 1764808  15476  11528 S   6.2  0.2   2:52.65 pulseaudio                                                                                                                
--  5185 usuario   20   0  602440  34612  25572 S   6.2  0.4   0:01.35 gnome-terminal-                                                                                                           
--  9699 usuario   20   0 1782564 282448 133804 S   6.2  3.5   0:16.06 chromium                                                                                                                  
--     1 root      20   0  139128   6988   5300 S   0.0  0.1   0:01.12 systemd                                                                                                                   
--     2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kthreadd                                                                                                                  
--     3 root      20   0       0      0      0 S   0.0  0.0   0:00.08 ksoftirqd/0  

ps

El comando ps nos mostrará la lista de procesos que corren, pero no en tiempo real y de manera interactiva, sino que imprime en pantalla, ideal para volcarlo en un archivo o procesar la información que el comando nos arroje.

ps
--  PID TTY          TIME CMD
-- 9782 pts/1    00:00:00 bash
--13249 pts/1    00:00:00 ps

Como puedes ver, el comando ‘ps‘ no nos está mostrando los mismos procesos del comando anterior. Lo anterior es debido a que solo nos mostró los procesos que estaban ejecutándose en ese momento; bash, porque estamos ejecutando el comando en la terminal y ‘ps‘, debido a que es el comando que corrimos. Ejecutemos el comando ahora con las opción ‘aux‘.

ps aux
-- USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
-- root         1  0.0  0.0 139128  6988 ?        Ss   08:52   0:01 /sbin/init
-- root         2  0.0  0.0      0     0 ?        S    08:52   0:00 [kthreadd]
-- root         3  0.0  0.0      0     0 ?        S    08:52   0:00 [ksoftirqd/0]

Ahora nos muestra más información, el porcentaje de CPU y el porcentaje de memoria. Toma en cuenta que el %CPU que nos muestran ambos comandos no será igual debido a que se calcula de manera diferente en cada uno de ellos. Puedes ver más detalles al respecto en el código o en los manuales de ambos comandos.

pstree

El comando pstree nos mostrará la lista de procesos que corren pero en formato gráfico y desglosado.

pstree
systemd─┬─ModemManager─┬─{gdbus}
        │              └─{gmain}
        ├─NetworkManager─┬─dhclient
        │                ├─{gdbus}
        │                └─{gmain}
        ├─accounts-daemon─┬─{gdbus}
        │                 └─{gmain}
        ├─avahi-daemon───avahi-daemon
        ├─colord─┬─{gdbus}
        │        └─{gmain}
        ├─containerd───13*[{containerd}]
        ├─cron
        ├─dbus-daemon
        ├─dockerd───14*[{dockerd}]
        ├─firefox-bin─┬─Privileged Cont─┬─{Chrome_~dThread}
...

kill

El comando asesino, para matar un proceso basta con escribir el comando en la terminal seguido de su identificador de proceso (PID), el número que aparece en los dos comandos anteriores. Es el comando perfecto para usar si chrome se comió toda la RAM y tu sistema ya no responde, o si quieres terminar algún proceso que está dando problemas. Al ejecutar este comando el programa sale normalmente, efectuando sus acciones de salida.

kill 9699
--# Finalizará el proceso con PID 9699, permitiéndo al proceso ejecutar acciones de salida

Si tras ese comando el proceso sigue sin responder, bastará con agregar la opción ‘-9’ al comando, este comando cortará el proceso sin darle tiempo a realizar sus acciones de salida.

kill -9 9699
--# Finalizará el proceso con PID 9699, sin permitirle al proceso ejecutar acciones de salida

wget

Con wget nosotros podremos descargar archivos de internet. Para usarlo le ponemos enfrente la dirección del recurso que queremos descargar, desde archivos hasta páginas web.

wget https://google.com
----2019-05-20 22:38:34--  https://google.com/
--Resolviendo google.com (google.com)... 216.58.217.14, 2607:f8b0:4012:80b::200e
--Conectando con google.com (google.com)[216.58.217.14]:443... conectado.
--Petición HTTP enviada, esperando respuesta... 301 Moved Permanently
--Localización: https://www.google.com/ [siguiendo]
----2019-05-20 22:38:35--  https://www.google.com/
--Resolviendo www.google.com (www.google.com)... 216.58.193.36, 2607:f8b0:4012:805::2004
--Conectando con www.google.com (www.google.com)[216.58.193.36]:443... conectado.
--Petición HTTP enviada, esperando respuesta... 200 OK
--Longitud: no especificado [text/html]
--Grabando a: “index.html”
--
--index.html                                          [ <=>                                                                                                  ]  ------11.11K  --.-KB/s    in 0.003s  
--
--2019-05-20 22:38:35 (3.73 MB/s) - “index.html” guardado [11380]

ping

El comando ping usa el protocolo ICMP para solicitar una respuesta. Esto, puesto en palabras más sencillas, significa que enviará una solicitud a internet para ver si recibe una respuesta. Generalmente se usa para determinar si una computadora puede acceder a otra. En este ejemplo recibimos una respuesta de la dirección que aparece después del comando.

ping www.lainchan.org
--PING www.lainchan.org (107.161.19.243) 56(84) bytes of data.
--64 bytes from lainchan.org (107.161.19.243): icmp_seq=1 ttl=54 time=95.3 ms
--64 bytes from lainchan.org (107.161.19.243): icmp_seq=2 ttl=54 time=96.4 ms
--64 bytes from lainchan.org (107.161.19.243): icmp_seq=3 ttl=54 time=95.3 ms
--^C
----- www.lainchan.org ping statistics ---
--3 packets transmitted, 3 received, 0% packet loss, time 2003ms
--rtt min/avg/max/mdev = 95.309/95.688/96.432/0.526 ms

curl

Este comando sirve para transferir información desde o hacia un servidor. Soporta múltiples protocolos, sin embargo frecuentemente es usado en desarrollo web para hacer pruebas.

curl example.org

Si le agregamos la opción -i incluye las cabeceras http o headers en la respuesta.

curl example.org -i
--HTTP/1.1 200 OK
--Age: 198550
--Cache-Control: max-age=604800
--Content-Type: text/html; charset=UTF-8
--Date: Sun, 25 Oct 2020 15:41:15 GMT
--Etag: "3147526947+ident"
--Expires: Sun, 01 Nov 2020 15:41:15 GMT
--Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
--Server: ECS (qro/9315)
--Vary: Accept-Encoding
--X-Cache: HIT
--Content-Length: 1256
--

Podemos enviar cookies a través de curl usando la opción –cookie

curl --cookie "this_cookie=does_nothing" example.org

También podemos hacer peticiones web POST, útil para emular el envío de formularios.

curl -X POST -F 'email=email@example.org' example.org

En curl enviamos cabeceras HTTP o headers usando la opción -H.

curl -H "Accept-Charset: utf-8" example.org

Si queremos omitir la respuesta, y mostrar únicamente las cabeceras de la respuesta, usamos la opción -I.

curl -I example.org
# HTTP/1.1 200 OK
# Content-Encoding: gzip

El comando curl es un comando con muchas opciones, para cubrir prácticamente cualquier necesidad, te recomiendo que le des una leída a su manual si quieres profundizar en sus funciones.

systemctl

systemctl es una utilidad de systemd, sirve para administrar el sistema y sus servicios, forma parte de la instalación predeterminada en algunos sistemas operativos con base Linux.

Este software ha suscitado una fuerte polémica entre entusiastas de GNU/Linux, debido a que se le acusa de ir en contra de los principios de Linux y querer incluirse como la opción por defecto de los sistemas GNU/Linux. El desprecio es tal que incluso existen distribuciones cuya única razón de existir es ofrecer una alternativa de otra distribución popular pero sin systemd. Por ejemplo Debian y Devuan, este último es un fork del popular Debian, pero sin systemd.

Systemctl nos permite ejecutar o detener servicios; agregarlos o removerlos al proceso de inicio de nuestro sistema operativo; ver su estado actual. Systemctl tiene muchas opciones, así que solo pondré las más comunes. Si quieres ahondar más en las capacidades de este comando ejecuta el comando ‘man systemctl‘ para ver su manual. Este comando debe ejecutarse con poderes de super usuario.

Aquí algunas de las capacidades de systemctl:

Iniciar un servicio

systemctl start postgresql
-- # Inicia el servicio de la base de datos postgresql

Reiniciar un servicio

systemctl restart postgresql
-- # Reinicia el servicio 

Mostrar el estatus de un servicio

systemctl status postgresql
--● postgresql.service - PostgreSQL RDBMS
--   Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
--   Active: active (exited) since Mon 2019-05-20 22:53:41 CDT; 49s ago
--  Process: 5587 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
-- Main PID: 5587 (code=exited, status=0/SUCCESS)
--      CPU: 538us
--
--may 20 22:53:41 horo systemd[1]: Starting PostgreSQL RDBMS...
--may 20 22:53:41 horo systemd[1]: Started PostgreSQL RDBMS.

Detener un servicio

systemctl stop postgresql
-- # Detiene el servicio postgresql

Agregar un servicio al inicio

systemctl enable postgresql
-- # Permite que postgresql se inicie al arrancar el sistema
--Synchronizing state of postgresql.service with SysV service script with /lib/systemd/systemd-sysv-install.
--Executing: /lib/systemd/systemd-sysv-install enable postgresql

Remover un servicio del inicio

systemctl disable postgresql
-- # Remueve postgresql de la lista de programas que se inician al arrancar el sistema
--Synchronizing state of postgresql.service with SysV service script with /lib/systemd/systemd-sysv-install.
--Executing: /lib/systemd/systemd-sysv-install disable postgresql

Mostrar los servicios en memoria

systemctl list-units 
-- # Lista las unidades que estan en memoria

Iniciar el proceso de apagado del SO

systemctl poweroff
-- # Apaga el sistema operativo. Si ejecutas este comando tu computadora se apagará

Reiniciar el SO

systemctl reboot
-- # Reinicia el sistema operativo. Si ejecutas este comando tu computadora se reiniciará

chown

Cambia el propietario de un archivo al que le especifiquemos. Hay que recordar que en Linux todo es un archivo, por lo que chown también puede usarse sobre directorios. Otro factor a tomar en cuenta para cambiar un archivo de propietario y/o grupo, es asegurarnos de que tenemos los permisos necesarios. Si tienes algún problema con los permisos ingresa como super usuario, si no sabes como hacerlo revisa la segunda parte de esta serie de entradas.

ls -la
--total 8
--drwxr-xr-x 2 usuario usuario 4096 may 13 12:22 .
--drwxr-xr-x 6 usuario usuario 4096 may 13 12:22 ..
---rw-r--r-- 1 usuario usuario    0 may 13 12:13 texto.txt
--# El comando nos muestra que el archivo texto.txt pertenece al usuario de nombre 'usuario' y al grupo llamado 'usuario'.
chown root texto.txt
ls -la
--total 8
--drwxr-xr-x 2 usuario usuario 4096 may 13 12:22 .
--drwxr-xr-x 6 usuario usuario 4096 may 13 12:22 ..
---rw-r--r-- 1 root usuario    0 may 13 12:13 texto.txt
--# El comando cambió su propietario a root

En el ejemplo anterior, únicamente especificamos un usuario. Para poder especificar un grupo deberemos usar la sintaxis de ‘usuario:grupo’. Debido a que solo nos falta cambiar el grupo omitiremos la primera parte de la sintaxis anterior, quedará como ‘:grupo

chown :root texto.txt
ls -la
--total 8
--drwxr-xr-x 2 usuario usuario 4096 may 13 12:22 .
--drwxr-xr-x 6 usuario usuario 4096 may 13 12:22 ..
---rw-r--r-- 1 root    root       0 may 13 12:13 texto.txt
--# Ahora el archivo también pertenece al grupo 'root'

Ahora regresemos todo a la normalidad usando la sintaxis completa: ‘usuario:grupo’

chown usuario:usuario texto.txt
ls -la
--total 8
--drwxr-xr-x 2 usuario usuario 4096 may 13 12:22 .
--drwxr-xr-x 6 usuario usuario 4096 may 13 12:22 ..
---rw-r--r-- 1 usuario usuario    0 may 13 12:13 texto.txt
--# Nuevamente el archivo texto.txt pertenece al usuario de nombre 'usuario' y al grupo llamado 'usuario'.

Ahora probemos cambiando el usuario y grupo de todos los archivos y del directorio usando la opción ‘-R‘ que nos permitirá hacer lo mismo que hicimos en el paso anterior con un archivo, pero esta vez de manera recursiva con los contenidos de un directorio.

ls -la
--total 8
--drwxr-xr-x 2 root    root    4096 may 13 13:04 .
--drwxr-xr-x 6 usuario usuario 4096 may 13 12:22 ..
---rw-r--r-- 1 root    root       0 may 13 12:50 .archivo_oculto.txt
---rw-r--r-- 1 root    root       0 may 13 13:04 texto1.txt
---rw-r--r-- 1 root    root       0 may 13 13:04 texto2.txt
chown -R usuario:usuario . 
ls -la
--total 8
--drwxr-xr-x 2 usuario usuario 4096 may 13 13:04 .
--drwxr-xr-x 6 usuario usuario 4096 may 13 12:22 ..
---rw-r--r-- 1 usuario usuario    0 may 13 12:50 .archivo_oculto.txt
---rw-r--r-- 1 usuario usuario    0 may 13 13:04 texto1.txt
---rw-r--r-- 1 usuario usuario    0 may 13 13:04 texto2.txt
--# Todos los archivos del directorio, inclusive los ocultos cambiaron de propietario y grupo

chmod

El comando anterior nos permitió cambiar el propietario y el grupo de un archivo. Este comando nos permite modificar los permisos de un archivo.

ls -la
--total 8
--drwxr-xr-x 2 usuario usuario 4096 may 13 14:11 .
--drwxr-xr-x 6 usuario usuario 4096 may 13 14:11 ..
---rw-r--r-- 1 usuario usuario    0 may 13 14:11 archivo.py
---rw-r--r-- 1 usuario usuario    0 may 13 14:11 archivo2.py

Como puedes ver, el comando anterior nos muestra en pantalla que el propietario de ambos archivos tiene permisos para leer y escribir, el grupo y otros únicamente pueden leer ambos archivos. Modificaremos los permisos con el comando chmod para añadir permisos extra.

chmod 755 archivo.txt
ls -la
--total 8
--drwxr-xr-x 2 usuario usuario 4096 may 13 14:11 .
--drwxr-xr-x 6 usuario usuario 4096 may 13 14:11 ..
---rwxr-xr-x 1 usuario usuario    0 may 13 14:11 archivo.py
---rw-r--r-- 1 usuario usuario    0 may 13 14:11 archivo2.py

Ahora el propietario, llamado usuario, puede leer, escribir y ejecutar archivo.py, el grupo llamado usuario y otros pueden leerlo y ejecutarlo. El archivo de nombre archivo2.py no sufrió modificaciones en sus permisos. Esta vez intentaremos usar la opción ‘-R‘ para especificar recursivamente los permisos del directorio completo y su contenido.

chmod 755 -R .
ls -la
--drwxr-xr-x 2 usuario usuario 4096 may 13 14:24 .
--drwxr-xr-x 6 usuario usuario 4096 may 13 14:23 ..
---rwxr-xr-x 1 usuario usuario    0 may 13 14:24 archivo.py
---rwxr-xr-x 1 usuario usuario    0 may 13 14:24 archivo2.py

Ahora el propietario, llamado usuario, puede escribir, leer y ejecutar ambos archivos de extensión ‘.py‘, mientras que el grupo llamado usuario y otros pueden leer y ejecutar, pero no escribir.

Aún más sobre el comando chmod

El sistema de permisos de GNU/Linux es un tema bastante complejo, por lo que hablaré de él con más detalle en la siguiente entrada. Entra aquí para ver el tutorial de permisos con chmod.

¿Quieres aprender más?

Sígueme en Twitter y te aviso cuando tenga nuevo contenido disponible. ¡Es gratis!

¿Te pareció útil esta información?

Recibe más contenido como este en tu correo electrónico. Suscríbete, te toma unos segundos, es gratis, y puedes cancelar cuando quieras

* Campo obligatorio