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.
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 qkill 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.
| Orden | Señal | Efecto |
|---|---|---|
| kill PID | TERM (15) | Pide al proceso que termine ordenadamente |
| kill -9 PID | KILL (9) | Lo elimina el núcleo, sin aviso ni limpieza |
| kill -1 PID | HUP (1) | Se usa para que un servicio relea su configuración |
| pkill nombre | TERM | Actú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.
| Antes | Ahora |
|---|---|
| service nombre_servicio start | systemctl start nombre_servicio |
| service nombre_servicio stop | systemctl stop nombre_servicio |
| service nombre_servicio status | systemctl status nombre_servicio |
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 solostart 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.
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 pesaEn 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.
mount /dev/sdb1 /mnt/usb # montar
mount # sin argumentos, lista lo que hay montado
umount /mnt/usb # desmontardf 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.
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 ARPping 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 ss | Qué añade |
|---|---|
| -t | Sockets TCP |
| -u | Sockets UDP |
| -l | Solo los que están a la escucha |
| -n | Números de puerto en lugar de nombres de servicio |
| -p | El proceso que tiene abierto cada socket |
ping -c 4 8.8.8.8
ss -tulnp # qué está escuchando y quién lo escuchaip 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.
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 gruposPara 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.
su - ana # abrir sesión como ana
sudo systemctl restart ssh # un comando concreto con privilegios
sudo -i # abrir una sesión de rootsu 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ón | Cómo se hace |
|---|---|
| Asignar | NOMBRE=valor, sin espacios alrededor del igual |
| Consultar el valor | Anteponiendo el símbolo del dólar al nombre |
| Mostrarla por pantalla | echo con el nombre precedido del dólar |
| Exportarla | export NOMBRE |
ENTORNO=preproduccion
echo $ENTORNO
export ENTORNO
ENTORNO=produccion ./desplegar.sh # solo para ese comandoSin 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