Service Management en Systemd

Cubre los flujos de trabajo systemctl para iniciar, activar, supervisar y personalizar servicios systemd.

Los servicios de un sistema Oracle Linux se gestionan mediante el comando systemctl subcommand.

Algunos ejemplos de subcomandos son enable, disable, stop, start, restart, reload y status.

Para obtener más información, consulte la página del manual systemctl(1).

Inicio y Parada de Servicios

Muestra los comandos systemctl start y systemctl stop básicos y explica cómo persisten los cambios de estado.

Para iniciar un servicio, utilice el comando systemctl start:

sudo systemctl start sshd

Para detener un servicio, utilice el comando systemctl stop:

sudo systemctl stop sshd

El cambio del estado de un servicio solo dura mientras el sistema permanece en el mismo estado.

Si detiene un servicio y, a continuación, cambia el destino de estado del sistema a uno en el que el servicio está configurado para ejecutarse (por ejemplo, reiniciando el sistema), el servicio se reinicia. Del mismo modo, el inicio de un servicio no permite que se inicie después de un reinicio. Consulte Activación y Desactivación de Servicios.

Activación y Desactivación de Servicios

Explica cómo activar, desactivar, enmascarar y desenmascarar servicios para que se inicien (o permanezcan detenidos) tras los reinicios.

Puede utilizar el comando systemctl para activar o desactivar un servicio desde el inicio cuando se inicia el sistema, por ejemplo:

sudo systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

El comando enable activa un servicio mediante la creación de un enlace simbólico para el destino de estado del sistema de nivel más bajo en el que se inicia el servicio. En el ejemplo anterior, el comando crea el enlace simbólico httpd.service para el destino multi-user.

Nota

Para iniciar el servicio al mismo tiempo que lo activa, incluya la opción --now en el comando. Por ejemplo: sudo systemctl enable --now httpd

La desactivación de un servicio elimina el enlace simbólico:

sudo systemctl disable httpd
Removed /etc/systemd/system/multi-user.target.wants/httpd.service.

Para comprobar si un servicio está activado, utilice el subcomando is-enabled, como se muestra en los siguientes ejemplos:

systemctl is-enabled httpd
disabled
systemctl is-enabled sshd
enabled

Después de ejecutar el comando systemctl disable, las cuentas del usuario, las secuencias de comandos y otros procesos pueden iniciar o detener el servicio.

Sin embargo, si necesita asegurarse de que un servicio en conflicto no pueda iniciar el servicio de forma involuntaria, por ejemplo, utilice el comando systemctl mask de la siguiente manera:

sudo systemctl mask httpd
Created symlink from '/etc/systemd/system/multi-user.target.wants/httpd.service' to '/dev/null'

El comando mask define la referencia de servicio en /dev/null. Si intenta iniciar un servicio que se ha enmascarado, recibirá un error como se muestra en el siguiente ejemplo:

sudo systemctl start httpd
Failed to start httpd.service: Unit is masked.

Para volver a enlazar la referencia de servicio al archivo de configuración de unidad de servicio coincidente, utilice el comando systemctl unmask:

sudo systemctl unmask httpd

Para obtener más información, consulte la página del manual systemctl(1).

Visualización del estado de los servicios

Detalla los comandos systemctl is-active y status para comprobar el estado del servicio y los grupos de control.

Para comprobar si un servicio se está ejecutando, utilice el subcomando is-active. La salida sería active o inactive, como se muestra en los siguientes ejemplos:

systemctl is-active httpd
active
systemctl is-active sshd
inactive

El subcomando status proporciona un resumen detallado del estado de un servicio, incluido un árbol que muestra las tareas del grupo de control (CGroup) que implementa el servicio:

systemctl status httpd
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since ...
     Docs: man:httpd.service(8)
 Main PID: 11832 (httpd)
   Status: "Started, listening on: port 80"
    Tasks: 213 (limit: 26213)
   Memory: 32.5M
   CGroup: /system.slice/httpd.service
           ├─11832 /usr/sbin/httpd -DFOREGROUND
           ├─11833 /usr/sbin/httpd -DFOREGROUND
           ├─11834 /usr/sbin/httpd -DFOREGROUND
           ├─11835 /usr/sbin/httpd -DFOREGROUND
           └─11836 /usr/sbin/httpd -DFOREGROUND

Jul 17 00:14:32 Unknown systemd[1]: Starting The Apache HTTP Server...
Jul 17 00:14:32 Unknown httpd[11832]: Server configured, listening on: port 80
Jul 17 00:14:32 Unknown systemd[1]: Started The Apache HTTP Server.

cgroup es una recopilación de procesos que están enlazados entre sí para que pueda controlar su acceso a los recursos del sistema. En el ejemplo, cgroup para el servicio httpd es httpd.service, que está en el segmento system.

Los segmentos dividen cgroups en un sistema en diferentes categorías. Para mostrar el segmento y la jerarquía cgroup, utilice el comando systemd-cgls:

systemd-cgls
Control group /:
-.slice
├─user.slice
│ └─user-1000.slice
│   ├─user@1000.service
│   │ └─init.scope
│   │   ├─6488 /usr/lib/systemd/systemd --user
│   │   └─6492 (sd-pam)
│   └─session-7.scope
│     ├─6484 sshd: root [priv]
│     ├─6498 sshd: root@pts/0
│     ├─6499 -bash
│     ├─6524 sudo systemd-cgls
│     ├─6526 systemd-cgls
│     └─6527 less
├─init.scope
│ └─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 16
└─system.slice
  ├─rngd.service
  │ └─1266 /sbin/rngd -f --fill-watermark=0
  ├─irqbalance.service
  │ └─1247 /usr/sbin/irqbalance --foreground
  ├─libstoragemgmt.service
  │ └─1201 /usr/bin/lsmd -d
  ├─systemd-udevd.service
  │ └─1060 /usr/lib/systemd/systemd-udevd
  ├─polkit.service
  │ └─1241 /usr/lib/polkit-1/polkitd --no-debug
  ├─chronyd.service
  │ └─1249 /usr/sbin/chronyd
  ├─auditd.service
  │ ├─1152 /sbin/auditd
  │ └─1154 /usr/sbin/sedispatch
  ├─tuned.service
  │ └─1382 /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P
  ├─systemd-journald.service
  │ └─1027 /usr/lib/systemd/systemd-journald
  ├─atd.service
  │ └─1812 /usr/sbin/atd -f
  ├─sshd.service
  │ └─1781 /usr/sbin/sshd

system.slice contiene servicios y otros procesos del sistema. user.slice contiene procesos de usuario, que se ejecutan en cgroups transitorios denominados ámbitos.

En el ejemplo, los procesos para el usuario con el ID 1000 se ejecutan en el ámbito session-7.scope en el segmento /user.slice/user-1000.slice.

Puede utilizar el comando systemctl para limitar la CPU, la E/S, la memoria y otros recursos que están disponibles para los procesos en los cgroups de servicio y ámbito. Consulte Controlling Access to System Resources.

Para obtener más información, consulte las páginas del manual systemctl(1) y systemd-cgls(1). Consulte también Using Systemd to Manage Control Groups.

Control de acceso a recursos del sistema

Muestra cómo utilizar systemctl set-property y systemd-run para asignar límites de CPU y memoria a servicios y ámbitos.

Utilice el comando systemctl para controlar el acceso de un cgroup a los recursos del sistema, por ejemplo:

sudo systemctl [--runtime] set-property httpd CPUShares=512 MemoryLimit=1G

CPUShare controla el acceso a los recursos de CPU. Como el valor por defecto es 1024, un valor de 512 reduce a la mitad el tiempo de acceso a la CPU que tienen los procesos en cgroup. Del mismo modo, MemoryLimit controla la cantidad máxima de memoria que puede utilizar cgroup.

Nota

No es necesario especificar la extensión .service para el nombre de un servicio.

Si especifica la opción --runtime, la configuración no se mantiene tras los reinicios del sistema.

También puede cambiar la configuración de recursos para un servicio en la cabecera [Service] del archivo de configuración del servicio en /usr/lib/systemd/system. Después de editar el archivo, vuelva a cargar los archivos de configuración systemd y, a continuación, reinicie el servicio:

sudo systemctl daemon-reload
sudo systemctl restart service

Puede ejecutar comandos generales dentro de los ámbitos y utilizar systemctl para controlar el acceso que estos cgroups transitorios tienen a los recursos del sistema. Para ejecutar un comando dentro de un ámbito, utilice el comando systemd-run:

sudo systemd-run --scope --unit=group_name.scope [--slice=slice_name]

Si no desea crear el grupo en el segmento system por defecto, puede especificar otro segmento o el nombre de un nuevo segmento. En el siguiente ejemplo, se ejecuta un comando denominado mymonitor en mymon.scope en myslice.slice:

sudo systemd-run --scope --unit=mymon.scope --slice=myslice mymonitor
Running as unit mymon.scope.
Nota

Si no especifica la opción --scope, el grupo de control se crea como un servicio en lugar de como un ámbito.

A continuación, puede utilizar systemctl para controlar el acceso que un ámbito tiene a los recursos del sistema de la misma manera que para un servicio. Sin embargo, a diferencia de un servicio, debe especificar la extensión .scope, por ejemplo:

sudo systemctl --runtime set-property mymon.scope CPUShares=256

Para obtener más información, consulte Using Systemd to Manage Control Groups y las páginas del manual systemctl(1), systemd-cgls(1) y systemd.resource-control(5).

Creación de un servicio systemd basado en usuario

Además de los archivos systemd de todo el sistema, systemd permite crear servicios basados en el usuario que se pueden ejecutar desde el nivel de usuario sin necesidad de acceso y privilegios de usuario root. Estos servicios basados en el usuario están bajo el control del usuario y se pueden configurar independientemente de los servicios del sistema.

A continuación se muestran algunas características distintivas de los servicios systemd basados en el usuario:

  • Los servicios systemd basados en el usuario están enlazados a una cuenta de usuario específica.
  • Se crean en el directorio raíz del usuario asociado en $HOME/.config/systemd/user/.
  • Después de activar estos servicios, se inician cuando el usuario asociado se conecta. Este comportamiento difiere del de los servicios systemd activados que se inician cuando se inicia el sistema.

Esta función es especialmente útil al crear servicios de contenedor Podman. Para obtener más información sobre Podman, consulte la Guía del usuario de Oracle Linux: Podman.

Para crear un servicio basado en el usuario:

  1. Cree el archivo de unidad del servicio en el directorio $HOME/.config/systemd/user, por ejemplo:
    touch $HOME/.config/systemd/user/myservice.service
  2. Abra el archivo unit y especifique los valores de las opciones que desea utilizar, como Description, ExecStart, WantedBy, etc.
    Para obtener más información, consulte Configurable Options in Service Unit Files y las páginas del manual systemd.service(5) y systemd.unit(5).
  3. Active el servicio para que se inicie automáticamente al iniciar sesión.
    systemctl --user enable myservice.service
    Nota

    Al cerrar la sesión, el servicio se detiene a menos que el usuario root haya activado los procesos para continuar ejecutándose para el usuario.

    Consulte https://docs.oracle.com/en/learn/ol-systemd/ para obtener más información.

  4. Inicie el servicio.
    systemctl --user start myservice.service
  5. Verifique que el servicio se esté ejecutando.
    systemctl --user status myservice.service

Cambio de los archivos de la unidad de servicio systemd

Describe cómo sustituir archivos de unidad empaquetados y crear fragmentos desplegables en /etc/systemd/system.

Para cambiar la configuración de los servicios systemd, copie los archivos con extensiones .service, .target, .mount y .socket de /usr/lib/systemd/system a /etc/systemd/system.

Después de haber copiado los archivos, puede editar las versiones en /etc/systemd/system.

Los archivos de /etc/systemd/system tienen prioridad sobre las versiones de /usr/lib/systemd/system. Los archivos de /etc/systemd/system no se sobrescriben cuando actualiza un paquete que toca archivos de /usr/lib/systemd/system.

Para volver a la configuración por defecto de systemd para un servicio concreto, puede cambiar el nombre o suprimir las copias en /etc/systemd/system.

Otro enfoque para cambiar la configuración de un servicio es crear un archivo desplegable. Con este enfoque, puede conservar la unidad original mientras cambia los parámetros específicos de la unidad.

Cree archivos desplegables en /etc/systemd/system/unit_name.d/, donde el directorio unit_name.d es una unidad existente y, a continuación, proporcione a los archivos desplegables una extensión de archivo .conf.

Por ejemplo: /etc/systemd/system/unit_name.d/name_of_drop-in.conf. systemd lee el archivo .conf y aplica la configuración a la unidad original.

En las siguientes secciones, se describen las diferentes partes de un archivo de unidad de servicio que puede editar y personalizar para un sistema.

Acerca de los archivos de unidades de servicio

Los servicios se ejecutan en función de sus archivos de unidad de servicio correspondientes. Un archivo de unidad de servicio normalmente contiene las siguientes secciones, y cada sección tiene sus respectivas opciones definidas que determinan cómo se ejecuta un servicio específico:

[Unit]

Contiene información sobre el servicio.

[UnitType]:

Contiene opciones que son específicas del tipo de unidad del archivo. Por ejemplo, en un archivo de unidad de servicio, esta sección se titula [Service] y contiene opciones que son específicas de unidades del tipo de servicio, como ExecStart o StandardOutput.

Sólo los tipos de unidad que ofrecen opciones específicas para su tipo tienen dicha sección.

[Install]

Contiene información de instalación para la unidad específica. La información de esta sección la utilizan los comandos systemctl enable y systemctl disable.

Un archivo de unidad de servicio puede contener las siguientes configuraciones para un servicio.

[Unit]
Description=A test service used to develop a service unit file template

[Service]
Type=simple
StandardOutput=journal
ExecStart=/usr/lib/systemd/helloworld.sh

[Install]
WantedBy=default.target

En Opciones Configurables en Archivos de Unidades de Servicio, se describen algunas opciones configuradas que se utilizan habitualmente en cada sección. También se puede consultar una lista completa en las páginas del manual systemd.service(5) y systemd.unit(5).

Opciones configurables en archivos de unidad de servicio

Cada una de las siguientes listas se ocupa de una sección independiente del archivo de unidad de servicio.

Descripción de las opciones de la sección [Unidad]

En la siguiente lista, se proporciona una visión general de las opciones configurables que se utilizan habitualmente en la sección [Unit] del archivo de unidad de servicio:

Description

Proporciona información sobre el servicio. La información se muestra al ejecutar el comando systemctl status en la unidad.

Documentation

Contiene una lista separada por espacios de los URI que hacen referencia a la documentación de esta unidad o su configuración.

After

Configura la unidad para que solo se ejecute después de que las unidades enumeradas en la opción terminen de iniciarse.

En el siguiente ejemplo, si el archivo var3.service tiene la siguiente entrada, solo se inicia después de que se hayan iniciado las unidades var1.service y var2.service:

 After=var1.service var2.service
Requires

Permite configurar una unidad para que tenga dependencias de condición académica en otras unidades. Si se activa una unidad, también se activan las que se muestran en su opción Requires.

Wants

Una versión menos estricta de la opción Requires. Por ejemplo, se puede activar una unidad específica incluso si una de las enumeradas en su opción Wants no se inicia.

Descripción de las opciones de la sección [Servicio]

En la siguiente lista, se proporciona una visión general de las opciones configurables que se utilizan habitualmente en la sección [Service] de un archivo de unidad de servicio.

Type

Permite configurar el tipo de inicio de proceso para la unidad de servicio.

Por defecto, el valor de este parámetro es simple, que indica que el proceso principal del servicio es el que inicia el parámetro ExecStart.

Normalmente, si el tipo de un servicio es simple, la definición se puede omitir del archivo.

StandardOutput
Configura el modo en que se registran los eventos del servicio. Por ejemplo, considere que un archivo de unidad de servicio tiene la siguiente entrada:
StandardOutput=journal

En el ejemplo, el valor journal indica que los eventos se registran en el asiento, que se puede ver mediante el comando journalctl.

ExecStart

Especifica la ruta completa y el comando que inicia el servicio, por ejemplo, /usr/bin/npm start.

ExecStop

Especifica los comandos que se deben ejecutar para parar el servicio iniciado mediante ExecStart.

ExecReload

Especifica los comandos que se deben ejecutar para disparar una recarga de configuración en el servicio.

Restart

Configura si el servicio se reiniciará cuando se cierre el proceso de servicio, se detenga o cuando se alcance un timeout.

Nota

Esta opción no se aplica cuando una operación systemd para el proceso de forma limpia, por ejemplo, systemctl stop o systemctl restart. En estos casos, esta opción de configuración no reinicia el servicio.
RemainAfterExit

Valor booleano que configura si el servicio se debe considerar activo incluso cuando todos sus procesos han salido. El valor por defecto es no.

Descripción de las opciones de la sección [Instalar]

En la siguiente lista, se proporciona una visión general de las opciones configurables que se utilizan habitualmente en la sección [Install] del archivo de unidad de servicio.

Alias

Lista separada por espacios de nombres para una unidad.

En el momento de la instalación, systemctl enable crea enlaces simbólicos desde estos nombres hasta el nombre de archivo de la unidad.

Los alias solo son efectivos cuando la unidad está habilitada.

RequiredBy

Configura el servicio que necesitan otras unidades.

Por ejemplo, considere un archivo de unidad var1.service que tenga la siguiente configuración agregada:

RequiredBy=var2.service var3.service

Cuando var1.service está activado, tanto var2.service como var3.service tienen otorgada una dependencia Requires en var1.service. Esta dependencia se define mediante un enlace simbólico creado en la carpeta .requires de cada servicio dependiente (var2.service y var3.service) que apunta al archivo de unidad del sistema var1.service.

WantedBy

Especifica una lista de unidades a las que se va a otorgar una dependencia wants en el servicio cuyo archivo está editando.

Por ejemplo, considere un archivo de unidad var1.service que tenga la siguiente configuración agregada:

WantedBy=var2.service var3.service

Cuando var1.service está activado, tanto var2.service como var3.service tienen otorgada una dependencia Wants en var1.service. Esta dependencia se define mediante un enlace simbólico que se crea en la carpeta ".wants" de cada servicio dependiente (var2.service y var3.service) que apunta al archivo de unidad del sistema para var1.service.

Also

Muestra las unidades adicionales que se deben instalar o quitar cuando se instala o elimina la unidad.

DefaultInstance

La opción DefaultInstance solo se aplica a los archivos de unidad de plantilla.

Los archivos de unidad de plantilla permiten la creación de varias unidades desde un único archivo de configuración. La opción DefaultInstance especifica la instancia para la que se activa la unidad si la plantilla está activada sin ninguna instancia definida explícitamente.

Creación de un archivo desplegable de unidad

Puede utilizar el comando systemctl edit para generar automáticamente un archivo de unidad o un archivo desplegable de unidad systemd para cualquier unidad systemd existente. Puede utilizar el archivo desplegable para sustituir la configuración base de una unidad o para ampliar los requisitos de un archivo de unidad.

  1. Ejecute el comando systemctl edit <unit> para generar automáticamente un archivo desplegable systemd y abrir el archivo en el editor predeterminado del sistema.

    Por ejemplo, para editar la unidad cockpit.socket para cambiar el puerto en el que recibe la consola web de Cockpit, puede hacer lo siguiente:

    sudo systemctl edit cockpit.socket --drop-in=listen.conf

    La opción --drop-in permite especificar el nombre de archivo que se utiliza para el archivo desplegable. Si no especifica esta opción, el nombre de archivo por defecto se define en override.conf.

    Se abre el editor de texto del sistema y puede agregar las líneas para sustituir la configuración por defecto:

    [Socket]
    ListenStream=
    ListenStream=443
    Nota

    Se necesita más configuración fuera de systemd si cambia el puerto de listener por defecto para Cockpit. Por ejemplo, puede que necesite cambiar los contextos de SELinux y la configuración del firewall.
  2. Guarde el archivo desplegable o salga.
    Si guarda los cambios en el archivo desplegable, el archivo se instala automáticamente en /etc/systemd/system/<unit>.d/<drop-in.file>. Si sale del editor sin guardar los cambios, el archivo no se crea y no se necesitan más actualizaciones.
  3. Vuelva a cargar la configuración del daemon systemd.
    sudo systemctl daemon-reload
  4. Reinicie la unidad systemd que ha actualizado.

    Por ejemplo, para reiniciar cockpit.socket que se utiliza en este ejemplo, ejecute:

    sudo systemctl restart cockpit.socket