Saltar la navegación

systemctl

Como se ha dicho, systemctl es el comando que se utilizará desde el espacio del usuario para controlar al sistema systemd, y tiene la siguiente sintaxis:

systemctl [opciones] acción [unidad...]

El comando systemctl puede ejecutarse remotamente con la opción -H, usa para ello el servicio SSH, por lo tanto, en la máquina remota donde queremos ejecutar systemctl debe haber instalado y configurado un servidor SSH.

Para conectarnos con el usuario actual de la terminal:

usuario@debian:~$ systemctl -H 25.30.35.40
usuario@25.30.35.40's password:

Para conectarnos con un usuario concreto:

usuario@debian:~$ systemctl -H fran@25.30.35.40
fran@25.30.35.40's password:

Como continuamente se intenta que systemd ejecute pararelamente más procesos en el arranque del sistema, los mensaje de inicio cada vez pasan más rápido y es más difícil detectar si algo ha fallado, incluso algunos mensajes puede que ni lleguen a salir. Para suplir esto, podemos usar systemctl para listar todas las unidades que están activas, tienen trabajos pendientes o han fallado:

# systemctl
UNIT LOAD ACTIVE SUB DESCRIPTION
proc-sys-fs-binfmt_misc.automount loaded active waiting Arbitrary Executable File Formats File System Automount Point
sys-devices-pci0000:00-0000:00:01.1-ata2-host1-target1:0:0-1:0:0:0-block-sr0.device loaded active plugged VBOX_CD-ROM
sys-devices-pci0000:00-0000:00:03.0-net-eth1.device loaded active plugged 82540EM Gigabit Ethernet Controller (PRO/1000 MT Desktop Adapter)
sys-devices-pci0000:00-0000:00:05.0-sound-card0.device loaded active plugged 82801AA AC'97 Audio Controller
sys-devices-pci0000:00-0000:00:0d.0-ata3-host2-target2:0:0-2:0:0:0-block-sda-sda1.device loaded active plugged VBOX_HARDDISK 1
sys-devices-pci0000:00-0000:00:0d.0-ata3-host2-target2:0:0-2:0:0:0-block-sda-sda2.device loaded active plugged VBOX_HARDDISK 2
sys-devices-pci0000:00-0000:00:0d.0-ata3-host2-target2:0:0-2:0:0:0-block-sda.device loaded active plugged VBOX_HARDDISK
sys-devices-platform-serial8250-tty-ttyS0.device loaded active plugged /sys/devices/platform/serial8250/tty/ttyS0
sys-devices-platform-serial8250-tty-ttyS1.device loaded active plugged /sys/devices/platform/serial8250/tty/ttyS1
sys-devices-platform-serial8250-tty-ttyS2.device loaded active plugged /sys/devices/platform/serial8250/tty/ttyS2
sys-devices-platform-serial8250-tty-ttyS3.device loaded active plugged /sys/devices/platform/serial8250/tty/ttyS3
sys-module-fuse.device loaded active plugged /sys/module/fuse
run-user-1000.mount loaded active mounted /run/user/1000
run-user-117.mount loaded active mounted /run/user/117
sys-fs-fuse-connections.mount loaded active mounted FUSE Control File System
sys-kernel-debug.mount loaded active mounted Debug File System
acpid.path loaded active running ACPI Events Check
systemd-ask-password-console.path loaded active waiting Dispatch Password Requests to Console Directory Watch
systemd-ask-password-wall.path loaded active waiting Forward Password Requests to Wall Directory Watch
session-1.scope loaded active running Session 1 of user usuario
session-c1.scope loaded active abandoned Session c1 of user lightdm
acpid.service loaded active running ACPI event daemon
apache2.service loaded active running LSB: Apache2 web server
atd.service loaded active running Deferred execution scheduler
avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
console-setup.service loaded active exited LSB: Set console font and keymap
...

O su equivalente:

# systemctl list-units

La columna ACTIVE nos muestra el estado de alto nivel de la unidad: en ejecución (active), parado (inactive) o en un estado de error como por ejemplo failed. En los casos en los que veamos un estado de error en una unidad, el siguiente paso a dar es el de pedir más información sobre el estado de la unidad fallida, lo cual haríamos con el comando:

# systemctl status unidad

Este comando no muestra solo mensajes de errores de inicio, sino que también nos llega a mostrar mensajes de errores en tiempo de ejecución.

La sintaxis general de systemctl con list-units es la siguiente:

# systemctl [opciones] list-units [patrón...]

Muchas acciones del comando systemctl incluyen un patrón para referirse a un conjunto de unidades. Este patrón se puede escribir utilizando los caracteres wildcards de la expansión de ficheros: *, ?, [ ], lo cuales deberíamos ponerlos entre comillas para evitar que el shell sea el que los expanda.

Si no se usa un patrón, sino que se especifica el nombre de una unidad concreta, este nombre puede llevar un sufijo (.service, .target, etc.) o no. En el caso de que no se indique dicho sufijo, por defecto se asume .service, menos para las acciones que operan sobre una unidad específica (son las menos), y en tal caso, se asume el sufijo de ese tipo de unidad. Por ejemplo:

# systemctl start sshd

es equivalente a:

# systemctl start sshd.service

La acción start asume por defecto el sufijo .service, en cambio, la acción isolate asume .target:

# systemctl isolate default

es equivalente a:

# systemctl isolate default.target

Para ver también en el listado las unidades con estado inactivo, hay que usar la opción --all:

$ systemctl list-units 'p*'
UNIT LOAD ACTIVE SUB DESCRIPTION
proc-sys-fs-binfmt_misc.automount loaded active running Arbitrary Executable File Formats File System Automount Point
proc-sys-fs-binfmt_misc.mount loaded active mounted Arbitrary Executable File Formats File System
plymouth-quit-wait.service loaded active exited Hold until boot process finishes up
plymouth-read-write.service loaded active exited Tell Plymouth To Write Out Runtime Data
plymouth-start.service loaded active exited Show Plymouth Boot Screen
polkit.service loaded active running Authorization Manager
paths.target loaded active active Path Units

Y ahora incluyendo las unidades inactivas:

$ systemctl --all list-units 'p*'
UNIT LOAD ACTIVE SUB DESCRIPTION
proc-sys-fs-binfmt_misc.automount loaded active running Arbitrary Executable File Formats File System Automount Point
proc-sys-fs-binfmt_misc.mount loaded active mounted Arbitrary Executable File Formats File System
plymouth-quit-wait.service loaded active exited Hold until boot process finishes up
plymouth-quit.service loaded inactive dead Terminate Plymouth Boot Screen
plymouth-read-write.service loaded active exited Tell Plymouth To Write Out Runtime Data
plymouth-start.service loaded active exited Show Plymouth Boot Screen
plymouth-switch-root.service loaded inactive dead Plymouth switch root service
polkit.service loaded active running Authorization Manager
● postgresql.service not-found inactive dead postgresql.service
paths.target loaded active active Path Units

La lista de posibles estados LOAD, ACTIVE y SUB no es fijo y las nuevas versiones de systemd podrían agregar y eliminar valores. La lista de valores que se están usando puede consultarse así:

$ systemctl --state help

Estos listados pueden afinarse con las opciones --type y --state.

La opción --type sirve para mostrar solo los tipos de unidad que se especifiquen:

$ systemctl --all --type mount,service list-units 'p*'
UNIT LOAD ACTIVE SUB DESCRIPTION
proc-sys-fs-binfmt_misc.mount loaded active mounted Arbitrary Executable File Formats File System
plymouth-quit-wait.service loaded active exited Hold until boot process finishes up
plymouth-quit.service loaded inactive dead Terminate Plymouth Boot Screen
plymouth-read-write.service loaded active exited Tell Plymouth To Write Out Runtime Data
plymouth-start.service loaded active exited Show Plymouth Boot Screen
plymouth-switch-root.service loaded inactive dead Plymouth switch root service
polkit.service loaded active running Authorization Manager
● postgresql.service not-found inactive dead postgresql.service

Pueden verse los tipos de unidades ejecutando:

# systemctl --type help

Con la opción --state podemos listar unidades en función de los posibles valores de las columnas LOAD, ACTIVE y SUB, por ejemplo:

$ systemctl --all --state not-found,mounted list-units 'p*'
UNIT LOAD ACTIVE SUB DESCRIPTION
proc-sys-fs-binfmt_misc.mount loaded active mounted Arbitrary Executable File Formats File System
● postgresql.service not-found inactive dead postgresql.service

Las opciones de systemctl pueden ponerse en cualquier parte de la orden, y el nombre de la unidad o el patrón de unidades también en cualquier parte pero siempre después de la acción.

$ systemctl --all list-units 'p*' --state not-found,mounted 
UNIT LOAD ACTIVE SUB DESCRIPTION
proc-sys-fs-binfmt_misc.mount loaded active mounted Arbitrary Executable File Formats File System
● postgresql.service not-found inactive dead postgresql.service
$ systemctl --all list-units --state not-found,mounted 'p*'
UNIT LOAD ACTIVE SUB DESCRIPTION
proc-sys-fs-binfmt_misc.mount loaded active mounted Arbitrary Executable File Formats File System
● postgresql.service not-found inactive dead postgresql.service

Para mostrar solo las unidades que están en estado de error, ejecutaríamos:

# systemctl --type failed

o su opción equivalente --failed:

# systemctl --failed

También hay unidades instaladas en el sistema pero no cargadas en memoria. Pueden consultarse todas las unidades systemd del sistema con la acción list-unit-files:

# systemctl [opciones] list-unit-files [patrón...]

Este listado muestra

Algunas unidades tienen más de un nombre, tienen alias, normalmente para conseguir un nombre más corto o por razones de compatibilidad con SysV. Estos alias pueden usarse en lugar del nombre de la unidad con la mayoría de las acciones, y se crean en el fichero de configuración de la unidad. Para conocer todos los nombres de una unidad, se utiliza la acción show junto con la opción -p Names:

$ systemctl show --property Names NetworkManager.service
Names=NetworkManager.service

En este caso, la unidad de servicio NetworkManager solo tiene un nombre.