1. Servicios, systemd y unidades
Un servicio, o demonio, es un programa que se ejecuta en segundo plano de manera permanente, sin terminal ni usuario que lo atienda, a la espera de trabajo: una conexión que llega, una hora que se cumple, un dispositivo que se conecta.
En el tema 33 aprendimos a dejar un programa en segundo plano con & y con nohup, y dijimos que eran soluciones de emergencia. Un servicio necesita más que sobrevivir al cierre de la terminal: debe arrancar solo con la máquina, en el orden correcto respecto de otros, volver a arrancar si se cae, y dejar constancia de lo que hace. De todo eso se ocupa un único programa.
systemd es el primer proceso que el kernel pone en marcha, el de PID 1, y el administrador de todo lo demás: inicia los servicios al arrancar, los supervisa mientras funcionan, los detiene al apagar y recoge sus mensajes. Cada cosa que administra se llama unidad.
Lo vimos en la raíz del árbol de procesos del tema 32. Lo usan Ubuntu, Debian, Fedora, Red Hat, Arch y openSUSE, de modo que este tema, como el 37 y el 38, vale para casi todas las distribuciones. Las unidades son de varias clases, que se distinguen por el sufijo de su nombre:
| Sufijo | La unidad representa | Ejemplo |
|---|---|---|
.service | Un servicio: un programa que systemd inicia y supervisa. | cron.service |
.timer | Un temporizador, que activa un servicio a ciertas horas. | apt-daily.timer |
.socket | Un punto de conexión: el servicio arranca cuando alguien se conecta. | ssh.socket |
.mount | Un sistema de archivos montado. Las líneas de /etc/fstab se convierten en unidades de este tipo. | boot-efi.mount |
.target | Un grupo de unidades, que marca una etapa del arranque. | multi-user.target |
Las del primer tipo son las que interesan, y por eso systemctl permite omitir el sufijo: cron se entiende como cron.service. systemctl, de system control, es el comando con que se le dan órdenes a systemd, y journalctl, el que lee los mensajes que systemd recoge. Son los dos comandos del tema.
Como ejemplo usaremos cron, el servicio que ejecuta las tareas programadas. Está en todos los sistemas, y detenerlo un minuto no causa ningún problema.
2. systemctl status: la ficha de un servicio
Lo usamos como ejemplo de subcomando en el tema 3, sin explicarlo. Es el comando más útil del tema, y no requiere sudo.
$ systemctl status cron
● cron.service - Regular background program processing daemon
Loaded: loaded (/usr/lib/systemd/system/cron.service; enabled; preset: enabled)
Active: active (running) since Tue 2026-10-13 08:29:14 -03; 2h 31min ago
Docs: man:cron(8)
Main PID: 842 (cron)
Tasks: 1 (limit: 9264)
Memory: 1.1M (peak: 4.6M)
CPU: 312ms
CGroup: /system.slice/cron.service
└─842 /usr/sbin/cron -f -P
oct 13 08:29:14 equipo systemd[1]: Started cron.service - Regular background program processing daemon.
oct 13 08:29:14 equipo cron[842]: (CRON) INFO (pidfile fd = 3)
oct 13 08:29:14 equipo cron[842]: (CRON) INFO (Running @reboot jobs)
oct 13 09:17:01 equipo CRON[5121]: (root) CMD (cd / && run-parts --report /etc/cron.hourly)
oct 13 10:17:01 equipo CRON[6340]: (root) CMD (cd / && run-parts --report /etc/cron.hourly)
| Línea | Informa |
|---|---|
| La primera | El nombre de la unidad y su descripción. El punto de la izquierda cambia de forma y de color con el estado. |
Loaded | De qué archivo se leyó la definición, y si el servicio está habilitado para arrancar con el sistema. |
Active | El estado actual, y desde cuándo. |
Docs | Dónde está su documentación: aquí, man 8 cron. |
Main PID | El proceso principal del servicio. |
Tasks, Memory, CPU | Cuántos procesos e hilos tiene, cuánta memoria ocupa y cuánto procesador lleva consumido. |
CGroup | El árbol de todos los procesos que pertenecen al servicio. |
| Las últimas | Sus mensajes más recientes en el registro. |
En una pantalla está casi todo lo que se puede preguntar de un servicio: si funciona, desde cuándo, con qué procesos, cuánto consume y qué fue lo último que dijo. Las dos palabras resaltadas responden dos preguntas distintas, que conviene no confundir y que retomamos en la sección 6: active dice que está funcionando ahora; enabled, que arrancará solo en el próximo inicio.
La línea CGroup muestra algo que ps no puede: systemd coloca cada servicio en un grupo propio, y sabe en todo momento qué procesos le pertenecen, aunque el servicio haya lanzado hijos y nietos. Por eso puede detenerlos a todos sin dejar ninguno suelto.
Si la salida ocupa más que la pantalla, systemctl la muestra con el paginador less, y se sale con q. Con --no-pager escribe todo de una vez, y con -n 20 se eligen cuántas líneas de registro mostrar.
3. Los estados, y las preguntas de sí o no
La línea Active lleva dos palabras: el estado general y, entre paréntesis, el detalle.
| Símbolo | Estado | Significa |
|---|---|---|
| ● verde | active (running) | El servicio está en ejecución. Es el estado normal de un demonio. |
| ● verde | active (exited) | Hizo su tarea y terminó bien. Es normal en servicios que configuran algo al arrancar y no dejan un proceso. |
| ● verde | active (waiting) | Espera un evento. Es el estado habitual de un temporizador. |
| ○ blanco | inactive (dead) | Está detenido. No es un error: nadie lo inició, o alguien lo detuvo. |
| × rojo | failed | Falló: no pudo arrancar, o terminó con un error. Es el que hay que investigar. |
| ● blanco | activating, deactivating | Está arrancando, o deteniéndose. Si no sale de ahí, está trabado. |
La diferencia entre inactive y failed es la que importa: un servicio detenido está donde alguien lo dejó; uno fallado quiso funcionar y no pudo.
Para preguntar por un solo dato hay tres subcomandos que responden una palabra, y que además comunican la respuesta por el código de salida del tema 25, lo que los hace aptos para encadenar con && y ||:
$ systemctl is-active cron
active
$ systemctl is-enabled cron
enabled
$ systemctl is-active cron ssh snapd # varios a la vez
active
inactive
active
$ systemctl is-active --quiet cron && echo "cron funciona" || echo "cron está caído"
cron funciona
| Se escribe | Pregunta | Código 0 si… |
|---|---|---|
systemctl is-active servicio | ¿Está funcionando? | Está activo. |
systemctl is-enabled servicio | ¿Arrancará con el sistema? | Está habilitado. |
systemctl is-failed servicio | ¿Falló? | Está en estado failed. |
4. Listar los servicios
Para ver el conjunto, systemctl list-units enumera las unidades que systemd tiene cargadas. Sin filtro son varios centenares, de todos los tipos; con dos opciones queda lo que se busca:
$ systemctl list-units --type=service --state=running
UNIT LOAD ACTIVE SUB DESCRIPTION
accounts-daemon.service loaded active running Accounts Service
cron.service loaded active running Regular background program processing daemon
dbus.service loaded active running D-Bus System Message Bus
NetworkManager.service loaded active running Network Manager
rsyslog.service loaded active running System Logging Service
snapd.service loaded active running Snap Daemon
systemd-journald.service loaded active running Journal Service
unattended-upgrades.service loaded active running Unattended Upgrades Shutdown
…
28 loaded units listed.
Las columnas ACTIVE y SUB son las dos palabras de la línea Active de la ficha. Entre los nombres hay conocidos: snapd, del tema 36; unattended-upgrades, el de las actualizaciones automáticas del tema 35; y dos que se ocupan de los registros, de los que hablaremos en la sección 9.
| Se escribe | Lista |
|---|---|
systemctl list-units --type=service | Los servicios cargados, en cualquier estado. |
systemctl list-units --type=service --state=running | Los que están en ejecución. |
systemctl --failed | Las unidades que fallaron. Es la primera consulta ante un sistema que anda mal. |
systemctl list-unit-files --type=service | Todos los servicios instalados, funcionen o no, con su estado de habilitación. |
systemctl list-unit-files --state=enabled | Lo que arranca con el sistema. |
$ systemctl --failed
UNIT LOAD ACTIVE SUB DESCRIPTION
0 loaded units listed.
$ systemctl list-unit-files --type=service --state=enabled --no-pager | wc -l
52
Una lista vacía en la primera consulta es la respuesta que se quiere ver. La diferencia entre list-units y list-unit-files es la que hay entre lo que está en memoria y lo que está en el disco: un servicio instalado que nunca se inició aparece en la segunda y no en la primera.
5. Iniciar, detener, reiniciar y recargar
Las órdenes sí requieren privilegios, y siguen la costumbre de la terminal: si todo sale bien, no escriben nada. El resultado se comprueba con status.
$ sudo systemctl stop cron
$ systemctl status cron
○ cron.service - Regular background program processing daemon
Loaded: loaded (/usr/lib/systemd/system/cron.service; enabled; preset: enabled)
Active: inactive (dead) since Tue 2026-10-13 11:02:40 -03; 4s ago
Duration: 2h 33min 26s
Process: 842 ExecStart=/usr/sbin/cron -f -P $EXTRA_OPTS (code=killed, signal=TERM)
Main PID: 842 (code=killed, signal=TERM)
…
$ sudo systemctl start cron
$ systemctl is-active cron
active
La ficha del servicio detenido cuenta cómo terminó: systemd le envió la señal TERM, la petición cortés del tema 33, y el proceso obedeció. Si no lo hubiera hecho en noventa segundos, le habría enviado KILL. Y nótese que sigue diciendo enabled: detenerlo ahora no cambia lo que pasará en el próximo arranque.
| Se escribe | Efecto | Cuándo |
|---|---|---|
sudo systemctl start servicio | Lo inicia. | |
sudo systemctl stop servicio | Lo detiene. | |
sudo systemctl restart servicio | Lo detiene y lo vuelve a iniciar: es un proceso nuevo. | Después de cambiar su configuración, o cuando se comporta mal. |
sudo systemctl reload servicio | Le pide que relea su configuración sin detenerse. | Cuando el servicio lo admite, y no se quiere cortar a quienes lo están usando. |
sudo systemctl reload-or-restart servicio | Recarga si puede; si no, reinicia. | Cuando no se sabe si admite recarga. |
sudo systemctl try-restart servicio | Lo reinicia solo si ya estaba funcionando. | En scripts. |
La diferencia entre restart y reload pesa en los servicios que atienden a otros. Reiniciar un servidor web corta las conexiones en curso; recargarlo aplica la configuración nueva sin que nadie lo note. Casi todos los servicios leen su configuración una sola vez, al arrancar —la misma razón por la que hacía falta source ~/.bashrc en el tema 34—, de modo que editar un archivo de /etc no tiene efecto hasta que se hace una de las dos cosas.
Si el comando se ejecuta sin sudo, en un escritorio aparece un pedido de contraseña, y en una sesión remota, el mensaje Interactive authentication required.
Por qué no se usa kill
Un servicio es un proceso, y se le podría enviar una señal. En el tema 33 dejamos anotado qué ocurre, y ahora se puede ver:
$ pidof cron
7802
$ sudo kill -9 7802
$ pidof cron
7841
$ journalctl -u cron -n 4 --no-pager
oct 13 11:06:31 equipo systemd[1]: cron.service: Main process exited, code=killed, status=9/KILL
oct 13 11:06:31 equipo systemd[1]: cron.service: Failed with result 'signal'.
oct 13 11:06:31 equipo systemd[1]: cron.service: Scheduled restart job, restart counter is at 1.
oct 13 11:06:31 equipo systemd[1]: Started cron.service - Regular background program processing daemon.
El proceso murió y, en el mismo segundo, hay otro con otro PID. Las cuatro líneas del registro lo narran: systemd vio que el proceso principal terminó de mala manera, lo anotó como una falla y lo inició de nuevo, porque la definición del servicio se lo ordena. Es la supervisión funcionando. Para detener un servicio hay que pedírselo a quien lo vigila; enviarle señales es discutir con el supervisor.
6. enable y disable: el arranque
Hay dos preguntas independientes sobre un servicio, y cada una tiene su par de órdenes.
| Ahora | En cada arranque | |
|---|---|---|
| La pregunta | ¿Está funcionando? | ¿Se iniciará solo? |
| Se consulta con | is-active | is-enabled |
| Para que sí | start | enable |
| Para que no | stop | disable |
| El efecto dura | Hasta el próximo reinicio | Hasta que se lo cambie |
Las cuatro combinaciones son posibles, y todas tienen sentido:
enabled | disabled | |
|---|---|---|
active | Lo normal: funciona, y seguirá funcionando después de reiniciar. | Funciona porque alguien lo inició a mano; tras un reinicio no estará. Es la causa clásica de «ayer andaba». |
inactive | Arrancará en el próximo inicio, pero ahora está detenido. | Instalado y sin uso. |
$ sudo systemctl disable cron
…
Removed "/etc/systemd/system/multi-user.target.wants/cron.service".
$ systemctl is-enabled cron; systemctl is-active cron
disabled
active
$ sudo systemctl enable cron
…
Created symlink /etc/systemd/system/multi-user.target.wants/cron.service → /usr/lib/systemd/system/cron.service.
Deshabilitarlo no lo detuvo: son cosas separadas. Y el mensaje muestra en qué consiste, materialmente, habilitar un servicio: en crear un enlace simbólico, como los del tema 14, dentro de un directorio que systemd recorre al arrancar. multi-user.target.wants se lee «lo que el sistema quiere tener en marcha cuando llega al estado multiusuario», que es el funcionamiento normal. No hay un registro oculto: la lista de lo que arranca es un directorio de enlaces, y se puede mirar con ls.
| Se escribe | Efecto |
|---|---|
sudo systemctl enable servicio | Arrancará con el sistema. No lo inicia ahora. |
sudo systemctl enable --now servicio | Lo habilita y lo inicia. Es lo que casi siempre se quiere. |
sudo systemctl disable servicio | No arrancará con el sistema. No lo detiene ahora. |
sudo systemctl disable --now servicio | Lo deshabilita y lo detiene. |
sudo systemctl mask servicio | Lo bloquea: no puede iniciarse de ninguna manera, ni a mano ni porque otro servicio lo pida. |
sudo systemctl unmask servicio | Lo desbloquea. |
Un servicio deshabilitado todavía puede arrancar si otro lo necesita o si alguien escribe start. Enmascararlo lo impide, y es la herramienta para cuando «deshabilité esto y sigue apareciendo».
Al instalar un paquete que trae un servicio, el comportamiento depende de la familia. En Debian y Ubuntu, apt install lo deja habilitado y funcionando. En Fedora y en Arch queda instalado y detenido, y hay que escribir enable --now. Los nombres también varían, como los de los paquetes en el tema 36:
| Servicio | Debian, Ubuntu | Fedora, RHEL |
|---|---|---|
| Tareas programadas | cron | crond |
| Servidor de acceso remoto | ssh | sshd |
| Servidor web Apache | apache2 | httpd |
7. Una unidad por dentro
La definición de un servicio es un archivo de texto, y systemctl cat lo muestra:
$ systemctl cat cron
# /usr/lib/systemd/system/cron.service
[Unit]
Description=Regular background program processing daemon
Documentation=man:cron(8)
After=remote-fs.target nss-user-lookup.target
[Service]
EnvironmentFile=-/etc/default/cron
ExecStart=/usr/sbin/cron -f -P $EXTRA_OPTS
IgnoreSIGPIPE=false
KillMode=process
Restart=on-failure
SyslogFacility=cron
[Install]
WantedBy=multi-user.target
Tres secciones entre corchetes, con líneas Clave=valor. Se lee sin haber visto ninguno antes:
| Sección | Línea | Dice |
|---|---|---|
[Unit] | Description | El texto que aparece en status y en las listas. |
After | Después de qué otras unidades debe arrancar. Así se ordena el inicio. | |
[Service] | ExecStart | El comando que se ejecuta para iniciar el servicio. Es una línea de comandos como las de este curso. |
EnvironmentFile | Un archivo con variables de entorno para el servicio: el mecanismo del tema 34. | |
Restart | Cuándo relanzarlo. on-failure: si termina mal. Es lo que vimos en la sección 5. | |
[Install] | WantedBy | Dónde se crea el enlace al habilitarlo: lo que explicaba el mensaje de enable. |
Esto quita misterio a los servicios. Uno es un comando, más unas instrucciones sobre cuándo ejecutarlo y qué hacer si termina. Las definiciones están en dos lugares, con un reparto que ya conocemos:
| Directorio | Contiene | Quién lo escribe |
|---|---|---|
/usr/lib/systemd/system/ | Las unidades que traen los paquetes. | El gestor de paquetes. No se editan: una actualización las reemplaza. |
/etc/systemd/system/ | Las unidades propias, los cambios locales y los enlaces de enable. | El administrador. Tienen precedencia sobre las anteriores. |
Es la regla de los temas 8 y 35: /usr es del gestor de paquetes, y /etc, de quien administra la máquina. Para cambiar algo de un servicio no se toca su archivo: se escribe sudo systemctl edit servicio, que abre el editor —el de la variable EDITOR— sobre un archivo de ajustes en /etc, donde se anotan solo las líneas que cambian.
Cuando se crea o se modifica a mano un archivo de unidad, systemd no se entera hasta que se le avisa, con sudo systemctl daemon-reload. Olvidarlo produce una advertencia que conviene reconocer: Warning: The unit file changed on disk. Run 'systemctl daemon-reload' to reload units.
8. Temporizadores, apagado y servicios de usuario
Temporizadores
Un temporizador es una unidad que activa un servicio en ciertos momentos. Son la forma en que systemd programa tareas, y la razón por la que el sistema hace cosas «solo»:
$ systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Tue 2026-10-13 14:22:10 -03 3h 9min Tue 2026-10-13 08:41:33 -03 2h 31min apt-daily.timer apt-daily.service
Wed 2026-10-14 00:00:00 -03 12h Tue 2026-10-13 08:29:14 -03 2h 43min logrotate.timer logrotate.service
Wed 2026-10-14 06:18:44 -03 19h Tue 2026-10-13 08:35:02 -03 2h 37min apt-daily-upgrade.timer apt-daily-upgrade.service
Mon 2026-10-19 00:33:51 -03 5 days Mon 2026-10-12 09:01:17 -03 1 day 2h fstrim.timer fstrim.service
…
11 timers listed.
Cada línea dice cuándo se ejecutará la próxima vez, cuánto falta, cuándo fue la última, y qué servicio dispara. Aquí está la explicación de varios comportamientos de temas anteriores. apt-daily renueva la lista de paquetes y apt-daily-upgrade instala las actualizaciones de seguridad: son los que a veces tienen ocupado el bloqueo de apt, como vimos en el tema 35. logrotate es el que archiva los registros, y aparece de nuevo en la sección 13.
Apagar y reiniciar
Como systemd administra el arranque, también administra el final. Estos comandos funcionan en un escritorio sin sudo, si no hay otros usuarios conectados:
| Se escribe | Efecto |
|---|---|
systemctl reboot | Reinicia el equipo, deteniendo antes cada servicio en orden. |
systemctl poweroff | Lo apaga. |
systemctl suspend | Lo suspende. |
sudo shutdown -r +10 "Mantenimiento" | Programa un reinicio para dentro de diez minutos, avisando a los usuarios conectados. shutdown -c lo cancela. |
El indicador muestra el nombre de la máquina por una razón, dijimos en el tema 34, y este es el caso. Con una terminal conectada a un servidor remoto y otra en el equipo propio, reboot escrito en la ventana equivocada reinicia el servidor, con todos sus usuarios adentro. Un vistazo al indicador, o un hostname, antes de pulsar Enter.
Servicios de usuario
En el árbol de procesos del tema 32 había un segundo systemd, con la opción --user. Es una instancia propia de cada sesión, que administra servicios del usuario: el servidor de sonido, los agentes de claves, las partes del escritorio. Se la consulta con los mismos subcomandos y la opción --user, sin privilegios:
$ systemctl --user list-units --type=service --state=running | head -n 4
UNIT LOAD ACTIVE SUB DESCRIPTION
dbus.service loaded active running D-Bus User Message Bus
pipewire.service loaded active running PipeWire Multimedia Service
xdg-desktop-portal.service loaded active running Portal service
Si un servicio «no existe» según systemctl status y sin embargo se lo ve en ps, puede ser de usuario: hay que repetir la consulta con --user.
9. Dos sistemas de registro
Un registro, o log, es la secuencia de mensajes que un programa va anotando sobre lo que hace: cuándo arrancó, qué pedido atendió, qué error encontró. Cada mensaje lleva la fecha, la máquina y el programa que lo escribió.
Un servicio no tiene terminal en la que escribir. Sus mensajes los recoge systemd, y en un sistema Ubuntu terminan en dos lugares a la vez, lo que al principio confunde.
| El journal | Los archivos de /var/log | |
|---|---|---|
| Lo escribe | systemd-journald | rsyslog, y algunos programas directamente |
| Formato | Binario, con índices | Texto, una línea por mensaje |
| Se lee con | journalctl | less, grep, tail, awk |
| Filtrar por servicio, fecha o gravedad | Con una opción | Con expresiones regulares, a mano |
| Incluye | Todo: kernel, servicios, y lo que cada servicio escribe en su salida de errores | Lo que se envía al sistema de registro |
| Está en | Todas las distribuciones con systemd | Debian y Ubuntu lo instalan; Fedora y Arch, ya no por defecto |
El journal es binario, y esa es la excepción más notable a la regla de que en Linux todo es texto: cat sobre sus archivos muestra basura. A cambio, guarda cada mensaje con sus datos por separado —el servicio, el PID, el usuario, la gravedad— y por eso puede filtrar por cualquiera de ellos sin adivinar el formato. Y journalctl escribe texto común, de modo que todo lo aprendido en el bloque 6 se le aplica a su salida.
Los registros contienen información sensible: quién entró, desde dónde, qué comando ejecutó con sudo. Por eso no los lee cualquiera. Un usuario común ve en el journal solo sus propios mensajes; los del sistema los ven root y los miembros del grupo adm, al que pertenece el primer usuario de Ubuntu, como vimos en el tema 16. Si journalctl avisa que no muestra todo, la solución es sudo.
10. journalctl: leer el journal
Sin opciones, journalctl muestra el journal completo, desde el mensaje más antiguo que conserve, dentro de less. Son cientos de miles de líneas; casi nunca es lo que se quiere, pero sirve para ver la forma de un mensaje:
oct 13 11:02:40 equipo sudo[7790]: ana : TTY=pts/0 ; PWD=/home/ana ; USER=root ; COMMAND=/usr/bin/systemctl stop cron
│ │ │ │ │
│ │ │ │ └─ el mensaje
│ │ │ └─ el PID del proceso
│ │ └─ el programa que lo escribió
│ └─ el nombre de la máquina
└─ la fecha y la hora
Este mensaje es, además, un recordatorio de lo dicho en el tema 19: cada uso de sudo queda anotado, con el usuario, el directorio y el comando completo.
| Se escribe | Muestra |
|---|---|
journalctl | Todo, desde el principio. |
journalctl -e | Lo mismo, saltando al final: lo más reciente. |
journalctl -n 50 | Los últimos 50 mensajes. |
journalctl -r | En orden inverso: lo más nuevo primero. |
journalctl -f | Los últimos mensajes, y los que vayan llegando. Se sale con Ctrl+C. |
journalctl -b | Solo los de este arranque. |
journalctl -b -1 | Los del arranque anterior. |
journalctl -k | Solo los del kernel. Sección 12. |
journalctl --no-pager | Sin less: escribe todo de corrido. Para tuberías y redirecciones. |
journalctl -f es el tail -f del tema 12, aplicado al journal, y se usa de la misma manera: en una terminal se lo deja corriendo, y en otra se hace lo que se quiere observar. Es la forma de ver qué pasa en el sistema en el momento en que se conecta un dispositivo, se inicia un servicio o falla un inicio de sesión.
La opción -b delimita por arranque, que suele ser el límite natural de un problema. El journal conserva varios, y se los enumera:
$ journalctl --list-boots | tail -n 3
-2 9c0b4e7a51f24d0c8e3a6b9d1f2c5a70 Sun 2026-10-11 09:02:11 -03 Sun 2026-10-11 23:40:02 -03
-1 d41f8a2b6c3e49a7b5d0e1f2a3c4b5d6 Mon 2026-10-12 08:55:40 -03 Tue 2026-10-13 00:12:31 -03
0 7a1e0c5594d34f0e8b6fa3c1d2e9b470 Tue 2026-10-13 08:29:01 -03 Tue 2026-10-13 11:20:44 -03
El índice 0 es el arranque actual, y su identificador es el Boot ID que mostraba hostnamectl en el tema 37. Los negativos son los anteriores. «¿Por qué se apagó anoche?» se responde mirando el final del arranque previo: journalctl -b -1 -e.
Cualquier usuario puede escribir en el journal, con logger. Sirve para dejar una marca antes de una prueba, y para que un script propio anote lo que hace:
$ logger -t practica "Prueba desde la terminal"
$ journalctl -t practica --no-pager
oct 13 11:21:08 equipo practica[7930]: Prueba desde la terminal
11. Filtrar: servicio, fecha y prioridad
La utilidad de journalctl está en sus filtros, que se combinan libremente. Tres cubren casi todas las consultas.
Por servicio: -u
$ journalctl -u cron -b --no-pager | tail -n 3
oct 13 11:06:31 equipo systemd[1]: cron.service: Scheduled restart job, restart counter is at 1.
oct 13 11:06:31 equipo systemd[1]: Started cron.service - Regular background program processing daemon.
oct 13 11:17:01 equipo CRON[7902]: (root) CMD (cd / && run-parts --report /etc/cron.hourly)
-u, de unit, muestra los mensajes de un servicio: los que escribió el programa y los que escribió systemd acerca de él. Es el filtro que más se usa, y las líneas finales de systemctl status son esto mismo, limitado a diez. Se puede repetir para ver varios servicios intercalados en orden de tiempo.
Por fecha: --since y --until
$ journalctl --since "10 minutes ago" --no-pager | wc -l
37
$ journalctl -u cron --since "11:00" --until "11:10" --no-pager | wc -l
9
| Se escribe | Abarca |
|---|---|
--since today | Desde las cero horas de hoy. |
--since yesterday --until today | El día de ayer, completo. |
--since "1 hour ago" | La última hora. También "30 min ago", "2 days ago". |
--since "09:00" --until "09:30" | Media hora de hoy. |
--since "2026-10-12 22:00" | Desde una fecha y hora exactas. |
Las expresiones van en inglés y, si llevan espacios, entre comillas. Acotar por tiempo es lo que convierte una búsqueda imposible en una lectura de veinte líneas: si se sabe que algo falló a las tres y cuarto, se pide de las tres y diez a las tres y veinte, y se lee todo lo que ocurrió alrededor, que es donde suele estar la causa.
Por prioridad: -p
Cada mensaje lleva un nivel de gravedad, de ocho posibles. Es un dato que los archivos de texto no muestran, y que en el journal permite separar lo que importa de la rutina.
| Nivel | Nombre | Se usa para |
|---|---|---|
| 0 | emerg | El sistema no puede seguir. |
| 1 | alert | Hay que actuar de inmediato. |
| 2 | crit | Una falla crítica. |
| 3 | err | Errores: algo no funcionó. |
| 4 | warning | Advertencias: funcionó, pero hay algo que mirar. |
| 5 | notice | Hechos normales que merecen atención. |
| 6 | info | Información de rutina. La gran mayoría de los mensajes. |
| 7 | debug | Detalle para quien desarrolla el programa. |
$ journalctl -b --no-pager | wc -l
4218
$ journalctl -b -p err --no-pager | wc -l
7
$ journalctl -b -p warning..warning --no-pager | wc -l
64
-p err muestra los mensajes de ese nivel y los más graves: de cuatro mil líneas quedan siete. La forma con dos puntos indica un rango, y con el mismo nivel en los dos extremos, ese nivel solo. En la pantalla, journalctl colorea las líneas según la gravedad: los errores en rojo, las advertencias en amarillo.
Conviene saber que casi todos los sistemas tienen algunos errores en cada arranque, por dispositivos que no existen o funciones que el equipo no ofrece, y que no significan nada. La manera de reconocerlos es mirar el registro cuando todo funciona bien: lo que aparece siempre no es la causa del problema de hoy.
Otros filtros y formatos
| Se escribe | Efecto |
|---|---|
-g 'patrón' | Solo los mensajes que coinciden con una expresión regular. Si el patrón va en minúsculas, no distingue mayúsculas. |
-t nombre | Por el nombre del programa: journalctl -t sudo. |
_PID=842, _UID=1000 | Por proceso; por usuario. |
/usr/bin/programa | Por la ruta del ejecutable. |
-o short-iso | Con la fecha en formato 2026-10-13T11:02:40-03:00, que se puede ordenar y comparar. |
-o cat | Solo el mensaje, sin fecha ni programa. |
-o json-pretty | Cada mensaje con todos sus campos. |
-x | Agrega explicaciones a algunos mensajes de systemd. |
$ journalctl -t sudo --since today -o cat --no-pager | grep -c COMMAND # usos de sudo hoy
14
$ journalctl -b -p err -o short-iso --no-pager | awk '{print $3}' | sort | uniq -c | sort -rn
4 kernel:
2 gdm-session-worker[2301]:
1 bluetoothd[901]:
La segunda línea es el recuento del tema 26, aplicado a la pregunta «¿quién produce los errores?». Con --no-pager, journalctl es un productor de texto más, y encaja en cualquier tubería.
12. El registro del kernel
El kernel también escribe, y sus mensajes son los que hablan del hardware: los dispositivos que detecta, los errores de disco, la memoria que se agota. Se los lee con journalctl -k, o con el comando tradicional, dmesg, que en Ubuntu requiere sudo.
$ journalctl -k --since "2 minutes ago" --no-pager
oct 13 11:26:02 equipo kernel: usb 1-2: new high-speed USB device number 5 using xhci_hcd
oct 13 11:26:02 equipo kernel: usb 1-2: Product: DataTraveler 3.0
oct 13 11:26:03 equipo kernel: sd 2:0:0:0: [sdb] 31260672 512-byte logical blocks: (16.0 GB/14.9 GiB)
oct 13 11:26:03 equipo kernel: sdb: sdb1
oct 13 11:26:03 equipo kernel: sd 2:0:0:0: [sdb] Attached SCSI removable disk
Es la tercera manera de saber qué nombre recibió un dispositivo, además de las dos del tema 38, y la que funciona cuando el dispositivo no aparece en lsblk: si el kernel no escribe nada al conectarlo, el problema es eléctrico; si escribe errores, ahí está el diagnóstico.
Y es aquí donde queda anotada la explicación que prometimos en el tema 37, para el programa que desaparece sin dejar mensaje:
$ journalctl -k -g 'out of memory' --no-pager
oct 12 16:41:07 equipo kernel: Out of memory: Killed process 5120 (firefox) total-vm:9812560kB, anon-rss:5234112kB, file-rss:0kB, shmem-rss:48212kB, UID:1000 pgtables:14232kB oom_score_adj:100
El kernel se quedó sin memoria y terminó el proceso 5120, que ocupaba cinco gigabytes. En los escritorios actuales suele adelantarse otro servicio, systemd-oomd, que mata antes de llegar al límite; sus mensajes se buscan con journalctl -u systemd-oomd.
| Se escribe | Muestra |
|---|---|
journalctl -k | Los mensajes del kernel de este arranque. |
journalctl -k -b -1 | Los del arranque anterior. dmesg no puede: solo conoce el actual. |
journalctl -k -p err | Los errores del kernel. |
journalctl -kf, sudo dmesg -w | Los que vayan llegando. |
sudo dmesg -T | El registro del kernel con fechas legibles, en lugar de segundos desde el arranque. |
Los mensajes del kernel que hay que tomar en serio son los que hablan de errores de entrada y salida en un disco —líneas con I/O error y el nombre de un dispositivo—, porque suelen anunciar un disco que está por fallar. Son la causa habitual del sistema de archivos que pasa solo a modo de solo lectura, del tema 38.
13. Los archivos de /var/log y el espacio
En Ubuntu, rsyslog sigue escribiendo los archivos de texto que recorrimos en el tema 8, y varios programas llevan además los suyos. Son los registros que se leen con las herramientas de siempre.
| Archivo | Contiene | En Fedora |
|---|---|---|
/var/log/syslog | El registro general: casi todo lo que no tiene archivo propio. | /var/log/messages |
/var/log/auth.log | Lo relativo a la identidad: inicios de sesión, sudo, ssh, cambios de contraseña. | /var/log/secure |
/var/log/kern.log | Los mensajes del kernel. | — |
/var/log/dpkg.log, /var/log/apt/ | La historia del gestor de paquetes, del tema 35. | dnf history |
/var/log/nginx/, /var/log/apache2/… | Los registros propios de un servicio, que no pasan por el journal: cada pedido atendido por un servidor web, por ejemplo. | Igual |
/var/log/journal/ | El journal. Binario: no se lee con cat. | Igual |
La penúltima fila es la razón por la que estos archivos importan aun teniendo journalctl: muchas aplicaciones escriben sus propios registros, y con más detalle que el que envían al sistema. El proyecto del tema 42 consiste en analizar uno de ellos.
$ ls -lh /var/log/syslog*
-rw-r----- 1 syslog adm 2,1M oct 13 11:26 /var/log/syslog
-rw-r----- 1 syslog adm 5,8M oct 12 00:00 /var/log/syslog.1
-rw-r----- 1 syslog adm 612K oct 5 00:00 /var/log/syslog.2.gz
-rw-r----- 1 syslog adm 588K sep 28 00:00 /var/log/syslog.3.gz
-rw-r----- 1 syslog adm 640K sep 21 00:00 /var/log/syslog.4.gz
$ grep -c 'cron' /var/log/syslog
31
$ zgrep -c 'cron' /var/log/syslog.2.gz
214
Los permisos confirman lo dicho: rw-r-----, del usuario syslog y el grupo adm. Y la lista muestra la rotación.
La rotación de registros es el procedimiento por el cual, periódicamente, el archivo en uso se renombra, se empieza uno nuevo, se comprimen los anteriores y se borra el más viejo. Evita que un registro crezca sin límite.
La hace logrotate, activado cada noche por el temporizador de la sección 8, según las reglas de /etc/logrotate.d/. El archivo sin número es el actual; el .1, el período anterior, todavía sin comprimir; del .2.gz en adelante, los más viejos, que se leen sin descomprimir con zcat, zless y zgrep, del tema 15. Un servidor que conserva cuatro semanas responde por lo ocurrido en el último mes, y no más.
Es el caso del tema 38: si se borra el archivo en que un servicio está escribiendo, el servicio sigue escribiendo en un archivo que ya no tiene nombre, el espacio no se libera y, además, los mensajes nuevos dejan de ser visibles. Para recuperar espacio de urgencia se vacía el archivo, con sudo truncate -s 0 /var/log/archivo, y luego se corrige la causa: una rotación mal configurada, o un programa que repite el mismo error mil veces por segundo. Lo segundo es lo más frecuente, y leer las últimas líneas antes de vaciar dice cuál es.
El espacio del journal
El journal se limita solo, a una fracción del sistema de archivos, pero esa fracción puede ser de gigabytes. Es la parte que le tocaba a este tema del inventario de la sección 8 del tema 38:
$ journalctl --disk-usage
Archived and active journals take up 1.1G in the file system.
$ sudo journalctl --vacuum-size=200M
…
Vacuuming done, freed 904.0M of archived journals from /var/log/journal/3f9c41d27a8e4b6b9d0e5a17c2f48b61.
| Se escribe | Efecto |
|---|---|
journalctl --disk-usage | Informa cuánto ocupa el journal. |
sudo journalctl --vacuum-size=200M | Borra los mensajes más viejos hasta que ocupe 200 MiB. |
sudo journalctl --vacuum-time=2weeks | Borra lo que tenga más de dos semanas. |
El directorio lleva por nombre el Machine ID del tema 37. Para que el límite sea permanente se fija SystemMaxUse=200M en /etc/systemd/journald.conf, y se reinicia systemd-journald. Como siempre, lo que es de un programa se limpia con ese programa, no con rm.
14. Diagnosticar un servicio que falla
Las dos mitades del tema se juntan en una situación: se cambió la configuración de un servicio, se lo reinició, y no arranca. El ejemplo es el servidor de acceso remoto, ssh, del que nos ocupamos en el tema siguiente.
$ sudo systemctl restart ssh
Job for ssh.service failed because the control process exited with error code.
See "systemctl status ssh.service" and "journalctl -xeu ssh.service" for details.
$ systemctl status ssh --no-pager -n 0
× ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/usr/lib/systemd/system/ssh.service; enabled; preset: enabled)
Active: failed (Result: exit-code) since Tue 2026-10-13 11:34:09 -03; 6s ago
Process: 8123 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=255/EXCEPTION)
CPU: 12ms
$ journalctl -u ssh -b -n 4 --no-pager
oct 13 11:34:09 equipo sshd[8123]: /etc/ssh/sshd_config: line 34: Bad configuration option: PermitRootLogn
oct 13 11:34:09 equipo sshd[8123]: /etc/ssh/sshd_config: terminating, 1 bad configuration options
oct 13 11:34:09 equipo systemd[1]: ssh.service: Control process exited, code=exited, status=255/EXCEPTION
oct 13 11:34:09 equipo systemd[1]: ssh.service: Failed with result 'exit-code'.
El mensaje de error de systemctl no dice qué pasó, pero dice dónde mirar, con los dos comandos escritos. La ficha confirma el estado failed y muestra que el proceso terminó con un código de salida distinto de cero. Y el registro tiene la respuesta completa, en la primera línea: archivo, número de línea y la palabra mal escrita. Falta una letra en PermitRootLogin.
- Leer el estado:
systemctl status servicio. ¿failed, oinactive? ¿Con qué código terminó? qué - Leer el registro:
journalctl -u servicio -b -e. Buscar el primer error, no el último. por qué - Corregir la causa: casi siempre, una línea de un archivo de
/etc. arreglar - Probar la configuración sin reiniciar, si el servicio lo permite. arreglar
- Reiniciar y comprobar:
sudo systemctl restart servicio, y otra vezstatus. verificar
El segundo paso tiene su indicación: el primer error. Cuando un programa falla, el motivo real se escribe una vez, y después vienen las consecuencias, que son las líneas que quedan a la vista al final. En el ejemplo, las dos últimas son de systemd constatando el fracaso; la causa estaba dos líneas más arriba.
El cuarto paso evita repetir el accidente. Muchos servicios tienen una opción que revisa la configuración y termina, sin afectar al que está funcionando. Es el mismo principio que mount -a para fstab, en el tema 38: probar antes de comprometerse.
| Servicio | Probar la configuración |
|---|---|
Servidor ssh | sudo sshd -t |
nginx | sudo nginx -t |
| Apache | sudo apachectl configtest |
sudoers | sudo visudo -c, del tema 19 |
| Un archivo de unidad | systemd-analyze verify archivo.service |
El ejemplo no fue elegido al azar. Si se rompe la configuración del servicio por el que uno está conectado y se lo reinicia, la sesión abierta suele sobrevivir, pero no se podrá abrir otra: quien cierra esa ventana se queda afuera de la máquina. La regla al tocar ssh, el cortafuegos o la red de un equipo remoto es probar la configuración, reiniciar, y verificar desde una segunda terminal que se puede entrar, antes de cerrar la primera. Es la misma red de seguridad que usamos para editar .bashrc en el tema 34.
15. Recetas y errores comunes
| Quiero… | Comando |
|---|---|
| Saber si un servicio funciona | systemctl status servicio |
| Ver qué servicios están en ejecución | systemctl list-units --type=service --state=running |
| Ver si algo falló | systemctl --failed |
| Ver qué arranca con el sistema | systemctl list-unit-files --state=enabled |
| Aplicar un cambio de configuración | sudo systemctl restart servicio, o reload |
| Que un servicio arranque siempre, y empiece ya | sudo systemctl enable --now servicio |
| Que no arranque más, y detenerlo | sudo systemctl disable --now servicio |
| Ver con qué comando se inicia un servicio | systemctl cat servicio |
| Ver las tareas programadas del sistema | systemctl list-timers |
| Ver qué tardó más en arrancar | systemd-analyze blame | head |
| Leer los últimos mensajes de un servicio | journalctl -u servicio -e |
| Seguir en vivo lo que dice un servicio | journalctl -u servicio -f |
| Ver los errores desde que arrancó el sistema | journalctl -b -p err |
| Ver qué pasó en un intervalo | journalctl --since "09:00" --until "09:15" |
| Ver por qué se apagó o se colgó la vez anterior | journalctl -b -1 -e |
| Ver qué dijo el kernel al conectar un dispositivo | journalctl -kf, y conectarlo |
| Saber si el kernel mató un proceso por falta de memoria | journalctl -k -g 'out of memory' |
Ver quién usó sudo hoy | journalctl -t sudo --since today |
| Buscar en los registros ya rotados | zgrep 'texto' /var/log/syslog.*.gz |
| Reducir el espacio del journal | sudo journalctl --vacuum-size=200M |
| Dejar una marca propia en el registro | logger -t etiqueta "mensaje" |
| Síntoma | Causa | Solución |
|---|---|---|
Unit nombre.service could not be found. | El nombre es otro, el paquete no está instalado, o es un servicio de usuario. | systemctl list-unit-files | grep texto; probar con --user. |
Interactive authentication required. | La orden necesita privilegios. | sudo. |
Job for … failed … See "systemctl status …" | El servicio no pudo arrancar. | Los dos comandos que el mensaje indica. Sección 14. |
| Cambié la configuración y el servicio se comporta igual. | La lee solo al arrancar. | restart o reload. |
| El servicio funcionaba y, después de reiniciar el equipo, no está. | Estaba iniciado, pero no habilitado. | sudo systemctl enable servicio. |
| Lo deshabilité y sigue arrancando. | Otra unidad lo requiere, o lo activa un socket o un temporizador. | sudo systemctl mask servicio; revisar list-timers. |
Lo maté con kill y reaparece. | systemd lo supervisa y lo relanza. | sudo systemctl stop servicio. |
Warning: The unit file … changed on disk. | Se editó un archivo de unidad sin avisar a systemd. | sudo systemctl daemon-reload. |
active (exited), y no hay ningún proceso. | Es un servicio que hace una tarea y termina. | Es lo normal. |
El estado oscila entre activating y failed. | Falla al arrancar, y systemd reintenta. | Leer el primer error en journalctl -u. |
System has not been booted with systemd as init system. | El sistema no usa systemd: un contenedor, o una instalación antigua de WSL. | En contenedores no hay servicios que administrar; en WSL, habilitar systemd en su configuración. |
journalctl avisa que no se muestran mensajes de otros usuarios. | Sin privilegios se ve solo lo propio. | sudo, o pertenecer al grupo adm. |
journalctl -u servicio responde -- No entries --. | El nombre no coincide, el servicio no escribió nada, o los mensajes ya se borraron por antigüedad. | Verificar el nombre con systemctl status; ampliar el período. |
journalctl se queda «colgado» en una pantalla. | Está dentro de less. | q para salir; --no-pager para evitarlo. |
La tubería después de journalctl -f no muestra nada. | Los filtros retienen la salida hasta juntar bastante. | Filtrar con las opciones de journalctl, -u y -g; o grep --line-buffered. |
dmesg: read kernel buffer failed: Operation not permitted | En Ubuntu, el registro del kernel está reservado. | sudo dmesg, o journalctl -k. |
cat /var/log/syslog responde Permission denied. | Los registros son del grupo adm. | sudo. |
Busco /var/log/syslog y no existe. | La distribución no instala rsyslog. | Usar journalctl. |
La referencia del tema:
| Se escribe | Qué hace |
|---|---|
systemctl status servicio | Muestra el estado, los procesos y los últimos mensajes. |
systemctl is-active, is-enabled, is-failed | Responden con una palabra y un código de salida. |
systemctl list-units --type=service | Lista los servicios cargados. |
systemctl --failed | Lista las unidades que fallaron. |
sudo systemctl start, stop, restart, reload | Inicia, detiene, reinicia, recarga la configuración. |
sudo systemctl enable, disable | Lo habilita o deshabilita para el arranque. Con --now, además lo inicia o lo detiene. |
sudo systemctl mask, unmask | Impide o permite que se inicie. |
systemctl cat servicio | Muestra su archivo de unidad. |
sudo systemctl daemon-reload | Hace que systemd relea los archivos de unidad. |
systemctl list-timers | Lista los temporizadores. |
systemctl reboot, poweroff | Reinicia; apaga. |
journalctl -u servicio | Los mensajes de un servicio. |
journalctl -b, -e, -f, -n N | Este arranque; ir al final; seguir en vivo; las últimas N líneas. |
journalctl --since, --until | Acota por fecha y hora. |
journalctl -p err | Solo los errores y lo más grave. |
journalctl -k, sudo dmesg | El registro del kernel. |
journalctl --disk-usage, --vacuum-size= | Cuánto ocupa el journal; reducirlo. |
logger "mensaje" | Escribe un mensaje en el registro. |
Con este tema el equipo ya no tiene partes opacas: sabemos qué programas tiene instalados, qué recursos consume, qué servicios lo mantienen andando y dónde escribe cada uno lo que le pasa. Hasta aquí, todo ocurrió dentro de una sola máquina. El último tema del bloque sale de ella. En el tema 40 vemos la red desde la terminal: averiguar la propia dirección, comprobar si otro equipo responde, descargar un archivo, y entrar a una máquina remota con ssh para usar allí todo lo aprendido.
16. Resumen
- Un servicio es un programa que funciona en segundo plano de manera permanente. systemd, el proceso de PID 1, los inicia, los supervisa y recoge sus mensajes. Cada cosa que administra es una unidad.
systemctl status serviciomuestra si funciona, desde cuándo, con qué procesos y qué fue lo último que escribió. No requieresudo.active (running)es el estado normal;inactive, detenido;failed, que quiso funcionar y no pudo.systemctl --failedlista lo que falló, ylist-units --type=service --state=running, lo que está en ejecución.start,stopyrestartactúan ahora.reloadhace releer la configuración sin detener el servicio. Un cambio de configuración no rige hasta reiniciar o recargar.- Un servicio no se detiene con
kill: systemd lo relanza. Se le pide asystemctl. enableydisabledeciden si arranca con el sistema, y son independientes de si funciona ahora.enable --nowhace las dos cosas.- La definición de un servicio es un archivo de texto:
systemctl catlo muestra. Los de los paquetes están en/usr/lib/systemd/system, y los cambios locales, en/etc/systemd/system. - Los temporizadores activan servicios a ciertas horas:
systemctl list-timers. - Los mensajes van al journal, binario, que se lee con
journalctl, y en Debian y Ubuntu también a archivos de texto en/var/log. journalctl -u serviciofiltra por servicio;-b, por arranque;--sincey--until, por fecha;-p err, por gravedad.-fsigue los mensajes en vivo.journalctl -kydmesgmuestran el registro del kernel: dispositivos, errores de disco y procesos terminados por falta de memoria.- Los archivos de
/var/logse rotan: el actual, el.1y los.gz, que se leen conzgrep. Un registro en uso se vacía, no se borra. journalctl --vacuum-sizereduce el espacio del journal.- Un servicio que falla se diagnostica con
statusyjournalctl -u, buscando el primer error; se corrige, se prueba la configuración y se reinicia.
17. Preguntas de repaso
Intenta responder cada una antes de abrir la respuesta.
1. ¿Qué es un servicio, y qué papel cumple systemd respecto de ellos?
Un servicio es un programa que funciona en segundo plano de manera permanente, sin terminal. systemd los inicia al arrancar, los supervisa, los relanza si corresponde, los detiene al apagar y recoge sus mensajes.
2. En la ficha de systemctl status, ¿qué diferencia hay entre enabled y active?
active indica que el servicio está funcionando ahora. enabled, que está configurado para iniciarse solo en cada arranque.
3. ¿Qué diferencia hay entre un servicio inactive y uno failed?
El inactive está detenido, porque nadie lo inició o alguien lo detuvo. El failed intentó funcionar y terminó con un error.
4. ¿Con qué comando ves, de un vistazo, si hay servicios que fallaron?
Con systemctl --failed.
5. Editaste el archivo de configuración de un servicio y nada cambió. ¿Por qué, y qué haces?
Porque el servicio lee su configuración al arrancar. Hay que reiniciarlo con sudo systemctl restart, o recargarlo con reload si lo admite.
6. ¿Qué diferencia hay entre restart y reload?
restart detiene el servicio y lo inicia de nuevo: es otro proceso, y las conexiones en curso se cortan. reload le pide que relea la configuración sin detenerse.
7. Matas un servicio con kill -9 y un segundo después hay otro proceso igual. ¿Qué ocurrió?
systemd detectó que el proceso terminó de mala manera y lo relanzó, porque la unidad lo indica con Restart=. Para detenerlo hay que usar sudo systemctl stop.
8. Instalaste un servicio, lo iniciaste con start y funcionó. Al día siguiente, después de reiniciar el equipo, no está. ¿Qué faltó?
Habilitarlo: sudo systemctl enable servicio. start solo lo inicia para la sesión actual del sistema.
9. ¿Qué hace sudo systemctl enable --now cron? ¿En qué consiste, materialmente, habilitar un servicio?
Lo habilita para el arranque y además lo inicia. Habilitar consiste en crear un enlace simbólico al archivo de unidad dentro de un directorio que systemd recorre al arrancar.
10. ¿Cómo averiguas qué comando ejecuta un servicio al iniciarse?
Con systemctl cat servicio, en la línea ExecStart de la sección [Service].
11. ¿Por qué no se puede leer el journal con cat o grep, y cómo se combina entonces con esos filtros?
Porque está guardado en formato binario. journalctl lo convierte en texto; con --no-pager, su salida se puede enviar por una tubería a cualquier filtro.
12. ¿Qué muestra journalctl -u ssh -b -p err?
Los mensajes del servicio ssh, del arranque actual, de nivel error o más grave.
13. Un servicio falló hoy a las 14:20. Escribe un comando que muestre todo lo que el sistema registró entre las 14:15 y las 14:25.
journalctl --since "14:15" --until "14:25"
14. ¿Para qué sirve journalctl -f, y a qué comando conocido se parece?
Muestra los últimos mensajes y sigue mostrando los que llegan, hasta Ctrl+C. Es el equivalente de tail -f para el journal.
15. Un programa desapareció sin mensaje de error. ¿Dónde buscas si lo terminó el kernel por falta de memoria?
En el registro del kernel: journalctl -k -g 'out of memory', o sudo dmesg.
16. En /var/log hay syslog, syslog.1 y syslog.2.gz. ¿Qué es cada uno, y cómo buscas una palabra en el último?
El archivo actual, el del período anterior y uno más viejo, comprimido: es la rotación de registros. En el comprimido se busca con zgrep palabra /var/log/syslog.2.gz.
17. Un servicio no arranca. ¿Cuáles son los dos primeros comandos, y qué buscas en el registro?
systemctl status servicio y journalctl -u servicio -b -e. En el registro se busca el primer error, que suele nombrar el archivo y la línea de la configuración.
Para practicar
- Ejecuta
systemctl status cron, ocronden tu distribución. Identifica el archivo de unidad, si está habilitado, desde cuándo funciona, su PID y cuánta memoria ocupa. Compara el PID con el depidof. - Cuenta los servicios en ejecución, los habilitados y los instalados. Comprueba con
systemctl --failedque no haya ninguno fallado, o averigua por qué lo está. - Detén
cron, mira su ficha, e inícialo de nuevo. Encadenasystemctl is-active --quiet croncon&&y||para que escriba «funciona» o «detenido», y pruébalo en los dos estados. - Con
cronen marcha, anota su PID, mátalo consudo kill -9, y vuelve a mirar el PID. Lee conjournalctl -u cron -n 6cómo lo contó systemd. - Deshabilita
crony comprueba que sigue activo. Lista el directorio/etc/systemd/system/multi-user.target.wants/antes y después de volver a habilitarlo. - Muestra el archivo de unidad de tres servicios con
systemctl cat. En cada uno, ubica el comando que lo inicia y su política de reinicio. - Ejecuta
systemctl list-timers. ¿Cuál es el próximo en ejecutarse? Averigua consystemctl catqué comando lanzará. - Abre
journalctl -fen una terminal. Desde otra, ejecutalogger -t practica "hola", un comando consudo, y conecta un dispositivo USB si tienes. Observa qué aparece en cada caso. - Cuenta los mensajes del arranque actual, y cuántos son de nivel
warningy cuántoserr. Obtén la lista de los programas que más errores produjeron, conawk,sortyuniq -c. - Consulta cuánto ocupa el journal, y cuántos arranques conserva. Lista
/var/log/syslog*, si existen, y busca la palabraerror, sin distinguir mayúsculas, en el archivo actual y en uno comprimido.