Comando systemctl en Linux: Iniciar, Detener y Gestionar Servicios
El comando systemctl en Linux es el gestor del Systemd, que es considerado el gestor de "casi todo" en Linux.
El sistema systemd ya es ampliamente utilizado en las distribuciones más conocidas, especialmente en las versiones de Kernel superiores a 2.6. Difícilmente encontrará una distribución moderna que no utilice el systemd.
Su principal ventaja es la carga del sistema de forma más rápida, ejecutando los servicios y procesos en paralelo. Esto fue posible con la llegada de los nuevos procesadores dotados de múltiples núcleos, que permiten la ejecución de varias threads en paralelo.
Entre las novedades del systemd, están:
- Activación vía socket y bus (ejecuta los servicios bajo demanda);
- Mejor paralelización de los procesos;
- Uso de cgroups (control groups – grupos de control) en lugar de PIDS;
- Soporta creación de imágenes de estado de memoria para guardar y restaurar estados de ejecución.
El sistema de control de grupos permite que el systemd supervise los procesos, de forma a garantizar que, cuando un servicio es detenido, todos los procesos hijos, nietos, bisnietos etc. también sean detenidos.
Con una gestión más robusta, se necesitan más ciclos de CPU para la creación de nuevos procesos. Pero debido al alto rendimiento de los procesadores, esto no parece ser un problema para el systemd.
En el systemd, la carga de procesos, cambio de runlevel y scripts de carga son muy diferentes del init.
Para comenzar, el Systemd trata los Runlevels como Targets o destinos. Cada Target puede tener varias Units.
Entienda las Units como objetos que son leídos por el Systemd. Estos objetos son archivos de configuración que definen por ejemplo:
- Nombre del objeto
- Requisitos previos para ejecución (si dependen de otras Units)
- Qué se debe hacer, por ejemplo, ejecutar un determinado programa o servicio
- Qué se debe hacer después de que el comando sea iniciado.
Estos archivos son muy abrangentes, y pueden definir una serie de cosas dependiendo de su tipo. Las Units más comunes del Systemd son:
- Tipo de servicio (service): usado para gestionar un servicio o aplicación en el servidor. Esto incluirá cómo iniciar o interrumpir el servicio, bajo qué circunstancias debe ser iniciado automáticamente y la información de dependencia y solicitud del software relacionado. Son archivos con extensión .service.
- Tipo de punto de montaje (mount): Esta unidad define un punto de montaje en el sistema a ser gestionado por el systemd. Son archivos con la extensión .mount
- Tipo de tiempo (timer): define que algo será gestionado por el systemd, similar a un trabajo cron, para activación diferida o programada. Son archivos con la extensión .timer
Vea una tabla comparativa de Runlevel (System V) y Targets del Systemd:
TABLA - Runlevels del Linux
| Runlevel | Descripción | Target |
| 0 | El nivel cero define un apagado elegante y rápido del sistema. | poweroff.target |
| 1 | Mantenimiento del Sistema | rescue.target |
| 2 | Estándar multiusuario modo texto | multi-user.target |
| 3 | Estándar multiusuario modo texto | multi-user.target |
| 4 | Estándar multiusuario modo texto | multi-user.target |
| 5 | Estándar multiusuario modo gráfico | graphical.target |
| 6 | Reinicio de la máquina | reboot.target |
La sintaxis de los archivos de configuración del Systemd, llamados unidades, está inspirada en los archivos .ini de Windows. Estos archivos se encuentran en dos directorios, a saber:
/usr/lib/systemd/system/: Unidades provenientes de paquetes de software instalados;
/etc/systemd/system/: Unidades instaladas por el administrador;
Modo de Emergencia y Rescate
Dos destinos especiales extra son rescate y emergencia.
Rescue.target
El modo de rescate o recuperación puede ser usado para un mantenimiento del sistema más "ligero". En este modo el sistema:
- Monta todos los sistemas de archivos locales;
- Solo el usuario root tiene permiso para iniciar sesión en el sistema;
- Los servicios de red son desactivados y solo algunos otros servicios son iniciados;
- El comando systemctl is-system-running retornará el estado de mantenimiento.
En este modo es posible ejecutar utilitarios de disco como el fsck o xfs_repair para corregir discos dañados. Este modo es útil para corregir también fallas en las configuraciones del sistema, o de servicios.
Emergency.target
El target de Emergencia es para un mantenimiento pesado, cuando muchas cosas salen mal, generalmente con datos dañados. En este modo el sistema:
- Monta solo el sistema de archivos raíz como solo lectura;
- Similar al modo de recuperación, solo permite que el usuario root inicie sesión en el sistema;
- Los servicios de red son desactivados y solo algunos otros servicios son iniciados;
- El comando systemctl is-system-running retornará el estado de mantenimiento.
Si el sistema entra en modo de emergencia sin dudas hay problemas serios. Este modo es usado para situaciones en que incluso el modo de rescate no funciona.
Comando systemctl
$ systemctl [opciones] comando [nombre]
El comando systemctl es quien comanda el show del sistema de gestión de servicios del systemd. Los comandos posibles son:
| Comando | Acción |
| list-units | Lista las units conocidas |
| list-sockets | Lista las units del tipo socket |
| list-timers | Lista las units del tipo timer |
| start NOMBRE | Inicia una o más units informadas en NOMBRE |
| stop NOMBRE | Para una o más units informadas en NOMBRE |
| reload NOMBRE | Recarga las configuraciones de una o más units informadas |
| restart NOMBRE | Reinicia una o más units informadas en NOMBRE |
| try-restart NOMBRE | Reinicia las units si están en ejecución. No hace nada si no están corriendo |
| isolate NOMBRE | Inicia todas las unidades especificadas y sus dependencias, y detiene todas las demás. Usado para cambio de target |
| status [NOMBRE] | Muestra el estado de una unidad o de todas si no se especifica nada |
| show [NOMBRE] | Muestra las propiedades de una o más unidades |
| cat NOMBRE | Muestra los archivos de una unidad |
| enable NOMBRE | Habilita una unidad para carga durante el boot. No inicia una unidad |
| disable NOMBRE | Deshabilita una unidad para carga durante el boot. No detiene la unidad |
| daemon-reload | Reinicia el servicio del systemd. |
| mask NOMBRE | Coloca el servicio en el limbo, imposibilitando su ejecución. |
| unmask NOMBRE | Retorna el servicio del limbo, posibilitando que sea iniciado. |
Generalmente el desarrollador no necesita saber crear, editar o alterar cualquier unit. Solo necesita saber listar las units, iniciar, detener, habilitar, deshabilitar, ver el estado y cambiar de Runlevel.
Puedes o no especificar la extensión de las unidades (.target / .service / .timer) al pasar el comando. El systemctl siempre va a buscar por un patrón indicado en el NOMBRE.
Estado en Systemctl
De esta forma, para verificar el servicio de cron (programador) se puede usar el comando status seguido del nombre de la unit cron con o sin la extensión ".service":
# systemctl status cron
O
# systemctl status cron.service
cron.service - Command Scheduler
Loaded: loaded (/lib/systemd/system/cron.service; enabled)
Active: active (running) since Mon, 28 May 2012 18:09:57
Main PID: 673 (cron)
CGroup: name=systemd:/system/cron.service
+ 673 /usr/sbin/cron -n
Detener un servicio con systemctl
Para detener un servicio:
# systemctl stop cron.service
Ver el estado del servicio cuando está detenido:
# systemctl status cron.service
cron.service - Command Scheduler
Loaded: loaded (/lib/systemd/system/cron.service; enabled)
Active: inactive (dead) since Mon, 28 May 2012 18:18:26
Main PID: 673 (code=exited, status=0/SUCCESS)
CGroup: name=systemd:/system/cron.service
Iniciar un servicio con systemctl
Para iniciar un servicio:
# systemctl start cron.service
Reiniciar un servicio con systemctl
Para reiniciar un servicio:
# systemctl restart cron.service
Habilitar un servicio en el boot con systemctl
Para habilitar un servicio durante la carga del sistema, se usa el comando enable:
# systemctl enable cron.service
Deshabilitar un servicio con systemctl
Para deshabilitar un servicio durante la carga del sistema, se usa el comando disable:
# systemctl disable cron.service
Cambiar el runlevel con systemctl
Para cambiar el runlevel al modo texto (runlevel 3), se usa el comando isolate
# systemctl isolate multi-user.target
Para cambiar el runlevel al modo gráfico (runlevel 5):
# systemctl isolate graphical.target
Para ver cuál es el runlevel que está en ejecución, se puede usar el comando get-default:
$ systemctl get-default
graphical.target
Alterar el runlevel predeterminado con systemctl
Para alterar el runlevel predeterminado hay dos maneras:
La primera es eliminar y recrear el enlace simbólico manualmente:
a) Para eliminar el enlace simbólico:
# rm /etc/systemd/system/default.target
b) Para colocar el runlevel 3 como predeterminado, recrear el enlace simbólico:
# ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
La segunda manera es usar el systemctl para hacer esto por ti, con el comando set-default:
# systemctl set-default multi-user.target
Removed /etc/systemd/system/default.target.
Created symlink /etc/systemd/system/default.target -> /usr/lib/systemd/system/multi-user.target.
Para ver qué units un servicio determinado es dependiente, se puede usar el comando list-dependencies:
$ systemctl list-dependencies apache2apache2.service● ├─-.mount● ├─system.slice● └─sysinit.target● ├─apparmor.service● ├─dev-hugepages.mount● ├─dev-mqueue.mount● ├─keyboard-setup.service● ├─kmod-static-nodes.service( ... )
Es importante decir que cuando un servicio determinado es iniciado por systemd, el gerenciador también va a iniciar todas las dependencias que ese servicio determinado requiere.
Por ejemplo, si el servicio system.slice está detenido y deshabilitado, y el administrador inicia el servicio de apache2, el servicio system.slice será iniciado, para que el servicio apache2 funcione correctamente.
Enmascarar (mask) un servicio con systemctl
Para evitar que un servicio sea ejecutado, aunque esté deshabilitado y haga parte de dependencia de alguna unit, el comando mask puede ser usado:
# systemctl mask apache2Created symlink /etc/systemd/system/apache2.service → /dev/null.
De esta forma, el systemctl va a crear un enlace simbólico del servicio hacia el limbo /dev/null. Así, el servicio no será iniciado de ninguna manera, aunque sea dependencia de otra unit:
# systemctl start apache2Failed to start apache2.service: Unit apache2.service is masked.
Para volver el servicio, el comando unmask puede ser ejecutado, retornando la unidad del exilio:
# systemctl unmask apache2Removed /etc/systemd/system/apache2.service.
Reiniciar el systemd con el systemctl
Cada vez que sea creada o alterada alguna unit, es necesario reiniciar el servicio del Systemd con el comando daemon-reload:
# systemctl daemon-reload
El systemd mantiene cierta compatibilidad con el System V, a través de un script que imita del comando service, que, en realidad, ejecuta comandos del systemctl.
Deshabilitando Servicios no Necesarios
Una tarea importante del administrador es deshabilitar los servicios innecesarios, especialmente servicios de red.
El primer paso es verificar qué servicios están en ejecución con el comando:
$ systemctl status
Este comando muestra una lista de todos los servicios en ejecución.
También se pueden listar los puertos abiertos y sus respectivos procesos con los comandos netstat o ss:
# netstat -tunlp
o
# ss -tunlp
Para detener los servicios innecesarios, se utiliza el comando:
# systemctl stop nomedoservico
Y para deshabilitar en el proceso de carga del sistema:
# systemctl disable nomedoservico
Si la distribución todavía usa el System V Init Daemon, los servicios en ejecución se pueden ver con el comando:
$ service --status-all
O con el comando:
$ chkconfig --list
Para detener los servicios, se puede utilizar el comando:
# service nomedoservido stop
Y para deshabilitar:
# chkconfig nomedoservico off
Aprende mucho más sobre Linux en nuestro curso en línea. Puedes realizar la inscripción aquí. Si ya tienes una cuenta, o quieres crear una, simplemente ingresa o crea tu usuario aquí.
¿Te gustó? Comparte
Eso fue solo una pieza. El curso enseña el camino completo — desde tu primer comando hasta el día del examen.