Saltar al contenido

Linux: procesos y servicios

Ver y terminar procesos, arrancar y parar servicios, saber cuánto disco queda y dónde se está yendo, montar unidades, comprobar la red, gestionar usuarios y manejar variables de entorno.

Ver y terminar procesos: ps, top y kill

Cada programa en ejecución es un proceso y tiene un identificador numérico, el PID, que es lo que se necesita para actuar sobre él. ps hace una fotografía del momento; top y su versión moderna htop muestran la lista viva y ordenada por consumo, y se refrescan solos.

bash
ps aux                    # todos los procesos, con usuario y consumo
ps -ef                    # el mismo listado en formato System V
ps aux | grep nginx       # filtrar por nombre
pgrep -a sshd             # solo los PID que coincidan
top                       # lista viva; se sale con q

kill no significa matar: significa mandar una señal. Por defecto envía la señal de terminación educada, que pide al proceso que cierre lo que esté haciendo y salga. Si el proceso no responde, se recurre a la señal 9, que lo corta en seco sin darle opción a guardar nada ni a cerrar sus ficheros.

OrdenSeñalEfecto
kill PIDTERM (15)Pide al proceso que termine ordenadamente
kill -9 PIDKILL (9)Lo elimina el núcleo, sin aviso ni limpieza
kill -1 PIDHUP (1)Se usa para que un servicio relea su configuración
pkill nombreTERMActúa por nombre en lugar de por PID

El menos nueve es el último recurso, no el primero: no deja al proceso cerrar sus ficheros y puede dejar datos a medias.

Para el examen

  • Qué hace kill: envía señales, no mata

  • Señal por defecto: TERM (15), terminación ordenada

  • kill -9: KILL: sin limpieza ni oportunidad de guardar

  • kill -1: HUP: releer la configuración

  • ps frente a top: ps fotografía; top vigila en vivo

Arrancar y parar servicios: service y systemctl

Un servicio, o demonio, es un proceso que corre en segundo plano y que el sistema arranca por su cuenta: el servidor web, el de bases de datos, el de acceso remoto. Quien los gobierna es el sistema de inicio, y ahí ha habido un cambio de generación que se pregunta mucho.

Antes se usaba el comando service, del sistema de inicio clásico. Hoy las distribuciones usan systemd, y el comando es systemctl. La forma también se invierte: en el clásico va primero el nombre del servicio y después la acción; en systemctl va primero la acción.

AntesAhora
service nombre_servicio startsystemctl start nombre_servicio
service nombre_servicio stopsystemctl stop nombre_servicio
service nombre_servicio statussystemctl status nombre_servicio
bash
systemctl start apache2      # arrancar ahora
systemctl stop apache2       # parar ahora
systemctl restart apache2    # parar y arrancar
systemctl status apache2     # ver si está en marcha y sus últimos mensajes
systemctl enable apache2     # que arranque solo en el próximo inicio
systemctl disable apache2    # que deje de arrancar solo

start y stop actúan ahora; enable y disable deciden qué pasará en el siguiente arranque. Son cosas distintas y se preguntan juntas para confundir.

Para el examen

  • Qué sustituye systemctl: a service; y pone la acción delante

  • start y stop: actúan ahora

  • enable y disable: actúan en el próximo arranque

Espacio en disco y montaje: df, du y mount

df responde a la pregunta de cuánto espacio queda, por sistema de ficheros montado. du responde a la contraria, en qué se está yendo el espacio, sumando lo que ocupa cada directorio. La opción -h de los dos convierte los bloques en kilos, megas y gigas.

bash
df -h                      # espacio libre por punto de montaje
df -i                      # i-nodos libres: un disco puede llenarse de nombres
du -sh /var/log            # tamaño total de un directorio
du -h --max-depth=1 /var   # qué subdirectorio de /var es el que pesa

En Linux no hay letras de unidad: un dispositivo se incorpora al árbol único colgándolo de un directorio, que se llama punto de montaje. Eso lo hace mount, y hay que ser root. umount lo desmonta, y falla si alguien está usando algo dentro, que es la causa habitual del mensaje de dispositivo ocupado.

bash
mount /dev/sdb1 /mnt/usb    # montar
mount                       # sin argumentos, lista lo que hay montado
umount /mnt/usb             # desmontar

df mira desde el sistema de ficheros hacia fuera y du desde los directorios hacia dentro. Sus cifras no tienen por qué coincidir.

Para el examen

  • df -h: espacio libre por punto de montaje

  • du -sh: lo que ocupa un directorio

  • mount: cuelga un dispositivo del árbol de directorios

  • Error típico de umount: «dispositivo ocupado» si algo lo está usando

Comprobar la red: ip, ping y ss

El comando moderno para todo lo relacionado con las interfaces y el encaminamiento es ip, que sustituyó a ifconfig y a route. Se organiza por objetos: addr para direcciones, link para interfaces y route para la tabla de encaminamiento.

bash
ip a                # direcciones de todas las interfaces
ip link             # estado de las interfaces
ip r                # tabla de encaminamiento y puerta de enlace
ip neigh            # vecinos conocidos, la tabla ARP

ping envía paquetes de eco y sirve para saber si el otro extremo contesta y con cuánto retardo. Un ping fallido no siempre significa que la máquina esté caída: muchos cortafuegos descartan ese tipo de tráfico.

ss muestra los sockets: qué puertos tiene abiertos la propia máquina y con quién está conectada. Sustituye a netstat y la combinación de opciones que se pregunta es -tulnp.

Opción de ssQué añade
-tSockets TCP
-uSockets UDP
-lSolo los que están a la escucha
-nNúmeros de puerto en lugar de nombres de servicio
-pEl proceso que tiene abierto cada socket
bash
ping -c 4 8.8.8.8
ss -tulnp            # qué está escuchando y quién lo escucha

ip sustituye a ifconfig y a route; ss sustituye a netstat. En un examen actual la respuesta buena suele ser la nueva.

Para el examen

  • ip: sustituye a ifconfig y route: ip a, ip r

  • ss: sustituye a netstat

  • ss -tulnp: qué puertos escuchan y qué proceso lo hace

  • Ping fallido: no prueba que la máquina esté caída: puede haber ICMP bloqueado

Usuarios y privilegios: useradd, passwd, su y sudo

Un usuario en Linux es un número, el UID, con un nombre asociado. El superusuario tiene siempre el UID 0, y las cuentas de personas se crean a partir del 1000. Un usuario pertenece a un grupo principal y puede pertenecer a otros secundarios.

bash
useradd -m -s /bin/bash ana     # -m le crea el directorio personal
passwd ana                      # asignarle contraseña
usermod -aG sudo ana            # añadirla a un grupo secundario
userdel -r ana                  # -r borra también su directorio personal
id ana                          # ver su UID, GID y grupos

Para hacer tareas administrativas hay dos caminos. su cambia de usuario y abre una sesión con esa identidad, y pide la contraseña del usuario de destino. sudo ejecuta un único comando con privilegios elevados y pide la contraseña de quien lo invoca, no la de root, y deja registro de quién hizo qué. Por eso hoy se prefiere sudo: no hace falta repartir la contraseña de root y queda trazabilidad.

bash
su - ana                # abrir sesión como ana
sudo systemctl restart ssh   # un comando concreto con privilegios
sudo -i                 # abrir una sesión de root

su pide la contraseña del usuario al que vas; sudo pide la tuya. Esa es la pregunta que más se falla de las dos.

Para el examen

  • UID de root: siempre 0

  • UID de las cuentas de personas: desde 1000

  • su: pide la contraseña de la cuenta de destino

  • sudo: pide la propia y deja registro de quién hizo qué

Variables de entorno

Una variable de entorno es un dato con nombre que el shell guarda y que los programas que lance pueden consultar. Sirve para no repetir rutas ni credenciales en cada comando y para que una misma orden se comporte distinto según la máquina en la que se ejecute.

OperaciónCómo se hace
AsignarNOMBRE=valor, sin espacios alrededor del igual
Consultar el valorAnteponiendo el símbolo del dólar al nombre
Mostrarla por pantallaecho con el nombre precedido del dólar
Exportarlaexport NOMBRE
bash
ENTORNO=preproduccion
echo $ENTORNO
export ENTORNO
ENTORNO=produccion ./desplegar.sh   # solo para ese comando

Sin export la variable existe solo en ese shell: los programas que se lancen desde él no la verán.

Para el examen

  • Cómo se asigna: NOMBRE=valor, sin espacios alrededor del igual

  • Cómo se lee: con el símbolo del dólar delante

  • Para que la vean los procesos hijos: hace falta export