fbpx Comando systemctl en Linux: Gestionar Servicios | Certificação Linux

Comando systemctl en Linux: Iniciar, Detener y Gestionar Servicios

📅 01/01/2019 ⏱ 11 min ✍️ Uira Ribeiro
Linuxcomandos
Comando systemctl en Linux: Iniciar, Detener y Gestionar Servicios
Exam Pass App — mais de 7.000 questões LPI, offline, em 5 idiomas, disponível no Android e na App Store
Disponible en
Google Play
Disponible en
App Store

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

RunlevelDescripciónTarget
0El nivel cero define un apagado elegante y rápido del sistema.poweroff.target
1Mantenimiento del Sistemarescue.target
2Estándar multiusuario modo textomulti-user.target
3Estándar multiusuario modo textomulti-user.target
4Estándar multiusuario modo textomulti-user.target
5Estándar multiusuario modo gráficographical.target
6Reinicio 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:

ComandoAcción
list-unitsLista las units conocidas
list-socketsLista las units del tipo socket
list-timersLista las units del tipo timer
start NOMBREInicia una o más units informadas en NOMBRE
stop NOMBREPara una o más units informadas en NOMBRE
reload NOMBRERecarga las configuraciones de una o más units informadas
restart NOMBREReinicia una o más units informadas en NOMBRE
try-restart NOMBREReinicia las units si están en ejecución. No hace nada si no están corriendo
isolate NOMBREInicia 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 NOMBREMuestra los archivos de una unidad
enable NOMBREHabilita una unidad para carga durante el boot. No inicia una unidad
disable NOMBREDeshabilita una unidad para carga durante el boot. No detiene la unidad
daemon-reloadReinicia el servicio del systemd.
mask NOMBREColoca el servicio en el limbo, imposibilitando su ejecución.
unmask NOMBRERetorna 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

Uira Ribeiro

Prof. Uirá Ribeiro

Chair do Board do Linux Professional Institute

Después de años viendo profesionales perder horas en tareas simples por no conocer las herramientas correctas de Linux, decidí enseñar.
Hoy soy autor de la mayoría de los Materiales de Aprendizaje oficiales de la LPI y mentor de más de 14,000 alumnos certificados.

Conoce mi historia completa →

Eso fue solo una pieza. El curso enseña el camino completo — desde tu primer comando hasta el día del examen.

Certificação Linux — a plataforma líder em certificações Linux no Brasil
WhatsApp