Systemd es el sistema init, colección de demonios y herramientas de administración de sistemas que se han convertido en el nuevo estándar para administrar servicios en Linux. Systemctl es una herramienta de línea de comandos para administrar y controlar los servicios de systemd. Con systemctl, puedes iniciar, detener, enumerar, habilitar y deshabilitar los servicios de systemd desde la línea de comandos.
Systemd usa archivos de unidad basados en el propósito y los recursos. Por ejemplo, los servicios tienen un archivo de unidad con extensiones .service, mientras que los archivos de unidad de dispositivo tienen extensiones .device. Todos los archivos de la unidad se almacenan en / etc / systemd / system / y / lib / systemd / system. Los archivos creados en tiempo de ejecución o tiempo de arranque se almacenan en / run / systemd / system /.
En esta guía te mostramos cómo administrar servicios y unidades usando el comando Systemctl en Ubuntu 20.04.
Requisitos
- Un servidor corriendo con Ubuntu 20.04.
- Una contraseña root establecida en tu servidor.
Instala Systemctl
Por defecto, systemctl viene preinstalado en la mayoría de los sistemas operativos.
Puedes comprobar esto con el siguiente comando:
# systemctl --version
Deberías ver la versión instalada de systemctl en el siguiente resultado:
systemd 245 (245.4-4ubuntu3)
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=hybrid
Para comprobar la localización de los binarios y librerías, utiliza el siguiente comando:
# whereis systemd
Éste es el resultado que deberías obtener:
systemd: /usr/bin/systemd /usr/lib/systemd /etc/systemd /usr/share/systemd /usr/share/man/man1/systemd.1.gz
Y después, debes correr el siguiente comando:
# whereis systemctl
Éste es el resultado que deberías ver:
systemctl: /usr/bin/systemctl /usr/share/man/man1/systemctl.1.gz
Para comprobar si systemd está corriendo o no, utiliza el siguiente comando:
# ps -ef | grep systemd
Más abajo tienes el resultado que deberías obtener:
root 259 1 0 10:34 ? 00:00:01 /lib/systemd/systemd-journald
root 284 1 0 10:34 ? 00:00:00 /lib/systemd/systemd-udevd
systemd+ 290 1 0 10:35 ? 00:00:00 /lib/systemd/systemd-networkd
message+ 309 1 0 10:35 ? 00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
root 320 1 0 10:35 ? 00:00:00 /lib/systemd/systemd-logind
systemd+ 356 1 0 10:35 ? 00:00:00 /lib/systemd/systemd-resolved
root 657 1 0 10:35 ? 00:00:00 /lib/systemd/systemd --user
Listar Unidades de Systemd
Puedes utilizar el comando systemctl para listar todas las unidades, las unidades activas y las inactivas.
Para listar todas las unidades, utiliza el siguiente comando:
# systemctl list-units --all
Deberías obtener el siguiente resultado:
UNIT LOAD ACTIVE SUB DESCRIPTION
proc-sys-fs-binfmt_misc.automount loaded active waiting Arbitrary Executable File Formats File System Automount Point
dev-disk-by\x2did-scsi\x2d0QEMU_QEMU_HARDDISK_drive\x2dscsi0\x2d0\x2d0\x2d0.device loaded active plugged QEMU_HARDDISK
dev-disk-by\x2did-scsi\x2d0QEMU_QEMU_HARDDISK_drive\x2dscsi0\x2d0\x2d0\x2d0\x2dpart1.device loaded active plugged QEMU_HARDDISK 1
dev-disk-by\x2dpartuuid-da29c858\x2d01.device loaded active plugged QEMU_HARDDISK 1
dev-disk-by\x2dpath-pci\x2d0000:00:05.0\x2dscsi\x2d0:0:0:0.device loaded active plugged QEMU_HARDDISK
dev-disk-by\x2dpath-pci\x2d0000:00:05.0\x2dscsi\x2d0:0:0:0\x2dpart1.device loaded active plugged QEMU_HARDDISK 1
dev-disk-by\x2duuid-29a0b164\x2d1ba1\x2d45a7\x2db23a\x2dcdb98f23edbc.device loaded active plugged QEMU_HARDDISK 1
dev-rfkill.device loaded active plugged /dev/rfkill
dev-sda.device loaded active plugged QEMU_HARDDISK
dev-sda1.device loaded active plugged QEMU_HARDDISK 1
Para listar todas las unidades activas, usa el siguiente comando:
# systemctl list-units
Más abajo está el resultado que deberías obtener:
proc-sys-fs-binfmt_misc.automount loaded active waiting Arbitrary Executable File Formats File System Automount Point
sys-devices-pci0000:00-0000:00:03.0-virtio0-net-eth0.device loaded active plugged Virtio network device
sys-devices-pci0000:00-0000:00:04.0-virtio1-net-eth1.device loaded active plugged Virtio network device
sys-devices-pci0000:00-0000:00:05.0-virtio2-host2-target2:0:0-2:0:0:0-block-sda-sda1.device loaded active plugged QEMU_HARDDISK 1
sys-devices-pci0000:00-0000:00:05.0-virtio2-host2-target2:0:0-2:0:0:0-block-sda.device loaded active plugged QEMU_HARDDISK
sys-devices-platform-serial8250-tty-ttyS1.device loaded active plugged /sys/devices/platform/serial8250/tty/ttyS1
sys-devices-platform-serial8250-tty-ttyS10.device loaded active plugged /sys/devices/platform/serial8250/tty/ttyS10
sys-devices-platform-serial8250-tty-ttyS11.device loaded active plugged /sys/devices/platform/serial8250/tty/ttyS11
Para listar todas las unidades inactivas, utiliza el siguiente comando:
# systemctl list-units --all --state=inactive
Éste es el resultado que deberías obtener:
UNIT LOAD ACTIVE SUB DESCRIPTION >
proc-sys-fs-binfmt_misc.mount loaded inactive dead Arbitrary Executable File Forma>
● tmp.mount not-found inactive dead tmp.mount >
ntp-systemd-netif.path loaded inactive dead ntp-systemd-netif.path >
acpid.service loaded inactive dead ACPI event daemon >
apt-daily-upgrade.service loaded inactive dead Daily apt upgrade and clean act>
apt-daily.service loaded inactive dead Daily apt download activities >
● auditd.service not-found inactive dead auditd.service >
● connman.service not-found inactive dead connman.service >
● console-screen.service not-found inactive dead console-
screen.service >
Listar Servicios Systemd
Para listar todos los servicios, utiliza el siguiente comando:
# systemctl list-units --type=service
Más abajo está el resultado que deberías ver:
UNIT LOAD ACTIVE SUB DESCRIPTION
apache2.service loaded active running The Apache HTTP Server
console-setup.service loaded active exited Set console font and keymap
cron.service loaded active running Regular background program processing daemon
csm.service loaded active exited Cloud Service Manager
dbus.service loaded active running D-Bus System Message Bus
getty@tty1.service loaded active running Getty on tty1
grub-common.service loaded active exited LSB: Record successful boot for GRUB
Para listar todos los servicios que están corriendo, utiliza el siguiente comando:
# systemctl list-units --type=service --state=running
Deberías ver el siguiente resultado:
UNIT LOAD ACTIVE SUB DESCRIPTION
apache2.service loaded active running The Apache HTTP Server
cron.service loaded active running Regular background program processing daemon
dbus.service loaded active running D-Bus System Message Bus
getty@tty1.service loaded active running Getty on tty1
networkd-dispatcher.service loaded active running Dispatcher daemon for systemd-networkd
ntp.service loaded active running Network Time Service
rsyslog.service loaded active running System Logging Service
serial-getty@ttyS0.service loaded active running Serial Getty on ttyS0
ssh.service loaded active running OpenBSD Secure Shell server
systemd-journald.service loaded active running Journal Service
systemd-logind.service loaded active running Login Service
systemd-networkd.service loaded active running Network Service
systemd-resolved.service loaded active running Network Name Resolution
systemd-udevd.service loaded active running udev Kernel Device Manager
user@0.service loaded active running User Manager for UID 0
Para listar todos los servicios inactivos, usa el siguiente comando:
# systemctl list-units --type=service --state=inactive
Más abajo tienes el resultado que deberías obtener:
UNIT LOAD ACTIVE SUB DESCRIPTION
acpid.service loaded inactive dead ACPI event daemon
apt-daily-upgrade.service loaded inactive dead Daily apt upgrade and clean activities
apt-daily.service loaded inactive dead Daily apt download activities
● auditd.service not-found inactive dead auditd.service
● connman.service not-found inactive dead connman.service
● console-screen.service not-found inactive dead console-screen.service
Comprobar el estado de un Servicio
También puedes comprobar el estado de un servicio específico utilizando el comando systemctl.
Por ejemplo, utiliza el siguiente comando para comprobar el estado del servicio de Apache:
# systemctl status apache2
Éste es el resultado que deberías ver:
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2021-07-21 11:27:53 UTC; 2min 57s ago
Docs: https://httpd.apache.org/docs/2.4/
Main PID: 1986 (apache2)
Tasks: 55 (limit: 2353)
Memory: 5.3M
CGroup: /system.slice/apache2.service
├─1986 /usr/sbin/apache2 -k start
├─1988 /usr/sbin/apache2 -k start
└─1989 /usr/sbin/apache2 -k start
También puedes utilizar los siguientes comandos para comprobar si un servicio en concreto está en estado activo, habilitado o fallido:
# systemctl is-active apache2
# systemctl is-enabled apache2
# systemctl is-failed apache2
Iniciar y Parar un Servicio
Puedes iniciar un servicio de forma fácil utilizando el comando systemctl.
Para iniciar el servicio Nginx, usa el siguiente comando:
# systemctl start nginx
Para parar el servicio Nginx, utiliza el siguiente comando:
# systemctl stop nginx
Si quieres reiniciar el servicio puedes utilizar el siguiente comando:
# systemctl restart nginx
En caso de únicamente necesitar recargar el servicio puedes ejecutar:
# systemctl reload nginx
Habilitar y Deshabilitar un Servicio
Cuando inicias cualquier servicio utilizando el comando systemctl, no se iniciará de forma automática después de un reinicio del sistema. Necesitarás habilitar que el servicio se inicie con un reinicio del sistema.
Para habilitar el servicio Nginx, utiliza el siguiente comando:
# systemctl enable nginx
Para deshabilitar que el servicio se inicie con un reinicio del sistema, utiliza el siguiente comando:
# systemctl disable nginx
Ocultar y Visibilizar un Servicio
Ocultar un servicio previene que el servicio se inicie de forma manual o automática.
Para ocultar el servicio MySQL, utiliza el siguiente comando:
# systemctl mask mysql
Para visibilizar el servicio MySQL, puedes hacerlo con el siguiente comando:
# systemctl unmask mysql
Si quieres eliminar todos los procesos y procesos hijos del servicio Apache, hazlo con el siguiente comando:
# systemctl kill apache2
Mostrar Propiedades de un Servicio
Para mostrar las propiedades del servicio Apache, utiliza el siguiente comando:
# systemctl show apache2
Para mostrar el contenido del archivo de servicio Apache, hazlo con el siguiente comando:
# systemctl cat apache2
Más abajo tienes el resultado que deberías obtener:
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=https://httpd.apache.org/docs/2.4/
[Service]
Type=forking
Environment=APACHE_STARTED_BY_SYSTEMD=true
ExecStart=/usr/sbin/apachectl start
ExecStop=/usr/sbin/apachectl stop
ExecReload=/usr/sbin/apachectl graceful
PrivateTmp=true
Restart=on-abort
[Install]
WantedBy=multi-user.target
Para mostrar dependencias del servicio Apache, utiliza el siguiente comando:
# systemctl list-dependencies apache2
Éste es el resultado que deberías obtener:
apache2.service
● ├─-.mount
● ├─system.slice
● └─sysinit.target
● ├─dev-hugepages.mount
● ├─dev-mqueue.mount
● ├─keyboard-setup.service
● ├─kmod-static-nodes.service
● ├─proc-sys-fs-binfmt_misc.automount
● ├─setvtrgb.service
● ├─sys-fs-fuse-connections.mount
● ├─sys-kernel-config.mount
● ├─sys-kernel-debug.mount
● ├─sys-kernel-tracing.mount
● ├─systemd-ask-password-console.path
● ├─systemd-binfmt.service
● ├─systemd-boot-system-token.service
● ├─systemd-hwdb-update.service
Conclusión
Esperamos que te hayas familiarizado con cómo utilizar systemctl para gestionar y controlar tus servicios systemd.
También puedes utilizar systemctl para solucionar incidencias de configuración que puedan darse.