Cómo gestionar los servicios de Systemd con Systemctl en Linux
Systemd es un proceso estándar para gestionar los servicios de arranque en los sistemas operativos Linux. Sirve para controlar qué programas se ejecutan al arrancar el sistema Linux. Es un gestor del sistema y se ha convertido en el nuevo estándar de los sistemas operativos Linux. Systemd te permite crear un servicio systemd personalizado para ejecutar y gestionar cualquier proceso. En este tutorial, explicaremos cómo gestionar servicios con systemd en Linux.
Requisitos previos
- Un servidor que ejecute Linux con Systemd, aquí utilizaré el servidor Ubuntu 20.04.
- Una contraseña de root configurada el servidor.
Verificar Systemd
Por defecto, Systemd viene preinstalado en los principales sistemas operativos. Puedes verificar la versión instalada de Systemd con el siguiente comando:
systemctl --version
Deberías ver la siguiente salida:
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
Puedes encontrar la ubicación de Systemd con el siguiente comando:
whereis systemd
Deberías obtener la siguiente salida:
systemd: /usr/bin/systemd /usr/lib/systemd /etc/systemd /usr/share/systemd /usr/share/man/man1/systemd.1.gz
Para encontrar la ubicación de Systemctl, ejecuta el siguiente comando:
whereis systemctl
Deberías obtener la siguiente salida:
systemctl: /usr/bin/systemctl /usr/share/man/man1/systemctl.1.gz
También puedes verificar si el Systemd se está ejecutando o no con el siguiente comando:
ps -eaf | grep systemd
Deberías obtener la siguiente salida:
root 269 1 0 09:57 ? 00:00:01 /lib/systemd/systemd-journald root 294 1 0 09:57 ? 00:00:00 /lib/systemd/systemd-udevd systemd+ 297 1 0 09:57 ? 00:00:00 /lib/systemd/systemd-networkd message+ 319 1 0 09:57 ? 00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only root 329 1 0 09:57 ? 00:00:00 /lib/systemd/systemd-logind systemd+ 382 1 0 09:57 ? 00:00:00 /lib/systemd/systemd-resolved root 1128 1 0 10:47 ? 00:00:00 /lib/systemd/systemd --user root 1177 1152 0 10:48 pts/0 00:00:00 grep --color=auto systemd
También puedes analizar el tiempo que tarda cada proceso en el arranque del sistema con el siguiente comando:
systemd-analyze blame
Deberías obtener la siguiente salida:
3.662s csm.service 1.899s apt-daily-upgrade.service 1.798s dev-sda1.device 1.400s systemd-logind.service 1.336s fstrim.service 1.207s systemd-networkd.service 1.131s systemd-resolved.service 856ms man-db.service 842ms systemd-journald.service 415ms e2scrub_reap.service 320ms keyboard-setup.service 295ms networkd-dispatcher.service 239ms systemd-udev-trigger.service
Para analizar la cadena crítica en el arranque con el siguiente comando
systemd-analyze critical-chain
Deberías obtener la siguiente salida:
The time when unit became active or started is printed after the "@" character. The time the unit took to start is printed after the "+" character. graphical.target @4.948s ??multi-user.target @4.946s ??csm.service @1.282s +3.662s ??basic.target @1.277s ??sockets.target @1.276s ??dbus.socket @1.274s ??sysinit.target @1.257s ??systemd-update-utmp.service @1.247s +8ms ??systemd-tmpfiles-setup.service @1.228s +17ms ??systemd-journal-flush.service @1.201s +24ms ??systemd-journald.service @356ms +842ms ??systemd-journald.socket @313ms ??system.slice @225ms ??-.slice @225ms
Gestionar los servicios con Systemd
Systemctl proporciona una forma más sencilla de gestionar los servicios de Systemd.
Para iniciar el servicio Apache, ejecuta el siguiente comando:
systemctl start apache2
Para reiniciar el servicio Apache, ejecuta el siguiente comando:
systemctl restart apache2
Para detener el servicio Apache, ejecuta el siguiente comando:
systemctl stop apache2
Para recargar el servicio Apache, ejecuta el siguiente comando:
systemctl reload apache2
Para permitir que el servicio Apache se inicie tras el reinicio del sistema, ejecuta el siguiente comando:
systemctl enable apache2
Para eliminar el servicio Apache del inicio del sistema, ejecuta el siguiente comando:
systemctl disable apache2
Para matar el servicio Apache, ejecuta el siguiente comando:
systemctl kill apache2
Para enmascarar el servicio Apache, ejecuta el siguiente comando:
systemctl mask apache2
Para desenmascarar el proceso Apache, ejecuta el siguiente comando:
systemctl unmask apache2
Para comprobar si el servicio Apache está activado o no, ejecuta el siguiente comando:
systemctl is-enabled apache2
Para comprobar el estado del servicio Apache, ejecuta el siguiente comando:
systemctl status apache2
Si el servicio está funcionando, deberías obtener la siguiente salida:
? apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2021-01-09 10:53:12 UTC; 26s ago Docs: https://httpd.apache.org/docs/2.4/ Main PID: 1708 (apache2) Tasks: 55 (limit: 2353) Memory: 5.8M CGroup: /system.slice/apache2.service ??1708 /usr/sbin/apache2 -k start ??1709 /usr/sbin/apache2 -k start ??1710 /usr/sbin/apache2 -k start Jan 09 10:53:12 ubuntu2004 systemd[1]: Starting The Apache HTTP Server...
Después de renombrar o eliminar cualquier archivo systemd, deberás recargarlo para aplicar los cambios. Para recargar el archivo de servicio systemd, ejecuta el siguiente comando:
systemctl daemon-reload
Gestionar archivos de unidad systemd
Los comandos anteriores serán útiles para gestionar servicios individuales. Sin embargo, no puede utilizarse para conocer el estado actual del sistema. Hay muchos otros comandos que son útiles para proporcionar esta información.
Para ver una lista de todas las unidades disponibles, ejecuta el siguiente comando:
systemctl list-unit-files
Deberías ver una lista de todos los archivos de las unidades en la siguiente salida:
UNIT FILE STATE VENDOR PRESET proc-sys-fs-binfmt_misc.automount static enabled -.mount generated enabled dev-hugepages.mount static enabled dev-mqueue.mount static enabled proc-sys-fs-binfmt_misc.mount disabled enabled sys-fs-fuse-connections.mount static enabled sys-kernel-config.mount static enabled sys-kernel-debug.mount static enabled sys-kernel-tracing.mount static enabled acpid.path enabled enabled ntp-systemd-netif.path enabled enabled systemd-ask-password-console.path static enabled systemd-ask-password-wall.path static enabled session-2.scope transient enabled acpid.service disabled enabled apt-daily-upgrade.service static enabled apt-daily.service static enabled [email protected] enabled enabled console-getty.service disabled disabled console-setup.service enabled enabled [email protected] static enabled cron.service enabled enabled cryptdisks-early.service masked enabled cryptdisks.service masked enabled csm.service enabled enabled dbus-org.freedesktop.hostname1.service static enabled dbus-org.freedesktop.locale1.service static enabled
Para ver una lista de todas las unidades activas, ejecuta el siguiente comando:
systemctl list-units
Deberías ver la siguiente salida:
UNIT LOAD ACTIVE SUB DESCRIPTION > proc-sys-fs-binfmt_misc.automount loaded active waiting Arbitrary Executable Fil> 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/se> sys-devices-platform-serial8250-tty-ttyS10.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS11.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS12.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS13.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS14.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS15.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS16.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS17.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS18.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS19.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS2.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS20.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS21.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS22.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS23.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS24.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS25.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS26.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS27.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS28.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS29.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS3.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS30.device loaded active plugged /sys/devices/platform/se> sys-devices-platform-serial8250-tty-ttyS31.device loaded active plugged /sys/devices/platform/se>
Para ver una lista de todas las unidades que han fallado, ejecuta el siguiente comando
systemctl --failed
Para ver una lista de todos los servicios, incluyendo los servicios activados y desactivados, ejecuta el siguiente comando:
systemctl list-unit-files --type=service
Deberías ver la siguiente salida:
UNIT FILE STATE VENDOR PRESET acpid.service disabled enabled apache-htcacheclean.service disabled enabled [email protected] disabled enabled apache2.service enabled enabled [email protected] disabled enabled apt-daily-upgrade.service static enabled apt-daily.service static enabled [email protected] enabled enabled console-getty.service disabled disabled console-setup.service enabled enabled [email protected] static enabled cron.service enabled enabled cryptdisks-early.service masked enabled cryptdisks.service masked enabled csm.service enabled enabled dbus-org.freedesktop.hostname1.service static enabled dbus-org.freedesktop.locale1.service static enabled dbus-org.freedesktop.login1.service static enabled dbus-org.freedesktop.resolve1.service enabled enabled dbus-org.freedesktop.timedate1.service static enabled dbus-org.freedesktop.timesync1.service masked enabled dbus.service static enabled debug-shell.service disabled disabled dmesg.service enabled enabled [email protected] static enabled e2scrub_all.service static enabled [email protected] static enabled e2scrub_reap.service enabled enabled emergency.service static enabled fstrim.service static enabled getty-static.service static enabled [email protected] enabled enabled
Para ver las propiedades de la unidad SSH, ejecuta el siguiente comando:
systemctl show sshd.service
Deberías ver la siguiente salida:
Id=sshd.service Names=sshd.service Requires=basic.target Wants=system.slice WantedBy=multi-user.target Conflicts=shutdown.target Before=shutdown.target multi-user.target After=syslog.target network.target auditd.service systemd-journald.socket basic.target system.slice Description=OpenSSH server daemon
Gestionar los sockets con Systemctl
También puedes gestionar los sockets mediante el comando Systemctl.
Para listar todos los sockets del sistema disponibles, ejecuta el siguiente comando:
systemctl list-unit-files --type=socket
Deberías ver la siguiente salida:
UNIT FILE STATE VENDOR PRESET acpid.socket enabled enabled dbus.socket static enabled ssh.socket disabled enabled syslog.socket static disabled systemd-fsckd.socket static enabled systemd-initctl.socket static enabled systemd-journald-audit.socket static enabled systemd-journald-dev-log.socket static enabled [email protected] static enabled systemd-journald.socket static enabled [email protected] static enabled systemd-networkd.socket disabled enabled systemd-rfkill.socket static enabled systemd-udevd-control.socket static enabled systemd-udevd-kernel.socket static enabled
Para iniciar el socket SSH, ejecuta el siguiente comando:
systemctl start ssh.socket
Para detener el socket SSH, ejecuta el siguiente comando:
systemctl stop ssh.socket
Para reiniciar el socket SSH, ejecuta el siguiente comando:
systemctl restart ssh.socket
Para comprobar el estado del socket SSH, ejecuta el siguiente comando:
systemctl status ssh.socket
Para activar y desactivar el socket SSH en el momento del arranque, ejecuta el siguiente comando:
systemctl enable ssh.socket
systemctl disable ssh.socket
Systemctl Comandos adicionales
Puedes realizar varias tareas con el comando systemctl. Si quieres poner el sistema en modo monopuesto, ejecuta el siguiente comando:
systemctl rescue
Para detener el sistema, ejecuta el siguiente comando:
systemctl halt
Para apagar el sistema, ejecuta el siguiente comando:
systemctl poweroff
Para reiniciar el sistema, ejecuta el siguiente comando:
systemctl reboot
Conclusión
En la guía anterior, has aprendido a gestionar y controlar el servicio systemd en Linux. Espero que esto te ayude a interactuar y controlar tu instancia de systemd. No dudes en preguntarme si tienes alguna duda.