
systemd es una herramienta robusta para manejar servicios de Linux. Si ha interactuado con un archivo de servicio systemd, probablemente haya sido un sencillo o bifurcación tipo. Hay muchos otros tipos de servicios en systemd, incluidos ejecutivo, dbus, notificar, inactivoy un tragocada uno con diferentes funciones.
Él un trago El tipo de servicio es útil si desea desencadenar un flujo de trabajo pero necesita realizar alguna configuración primero o tiene una serie de tareas independientes secuenciales. Si fueras a usar un sencillo tipo de servicio, terminaría con un estado de servicio inactivo después de que el script se ejecute y finalice, lo que es engañoso para cualquier persona que no tenga conocimiento de ese servicio en particular. También es un gran servicio para ejecutar como un gancho de apagado.
La página man de systemd.service ofrece más detalles sobre cada tipo de servicio. De acuerdo con la página man de systemd:
[The] comportamiento de un trago es parecido a sencillo; sin embargo, el gerente de servicio considerará que la unidad está lista después de que finalice el proceso principal. A continuación, iniciará las unidades de seguimiento.
RemainAfterExit=
es particularmente útil para este tipo de servicio.Type=oneshot
es el valor predeterminado implícito si ningunoType=
niExecStart=
se especifican. Tenga en cuenta que si esta opción se utiliza sinRemainAfterExit=
el servicio nunca entrará en el estado de unidad «activo», sino que pasará directamente de «activar» a «desactivar» o «muerto» ya que no hay ningún proceso configurado que se ejecute de forma continua. En particular, esto significa que después de ejecutar un servicio de este tipo (y que haRemainAfterExit=
no configurado) no aparecerá como iniciado después, sino como muerto.
Un gran ejemplo del uso de un un trago service es construirlo en una imagen dorada y conectarlo al proceso de inicio para realizar una acción específica. Tal vez desee realizar una llamada única a un servicio y establecer su valor en una variable de entorno. O tal vez desee ejecutar una verificación de estado del sistema muy específica para asegurarse de que un sistema complejo en el servidor se haya iniciado correctamente. Él un trago El servicio puede ser útil en muchas situaciones diferentes.
¿Qué hay en un archivo de servicio?
Antes de empezar a usar un tragomostraré cómo se ve un archivo de servicio.
[ Want to know more about systemd? Download the free Linux systemd cheat sheet. ]
Aquí hay un archivo de servicio para Nginx ubicado en /usr/lib/systemd/system/nginx.service
:
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Todo servicio debe tener un [Service]
bloque, y el [Unit]
y [Install]
Las secciones son comunes.
Él [Unit]
bloque define información que no depende del tipo de historia. Description
es bastante autoexplicativo. After
y Wants
se utilizan para ordenar.
Él [Service]
El bloque contiene todas las configuraciones específicas del servicio. Parámetros como los comandos de inicio y recarga y si PrivateTmp
se utiliza se especifican aquí. Esta sección alberga la Type
parámetro, que es donde oneshot
se especificaría el tipo de servicio.
Él [Install]
bloque por lo general incluye el WantedBy
parámetro y ocasionalmente un RequiredBy
parámetro. Esa sección solo se usa cuando habilita un servicio con systemctl enable
. Cuando un servicio está habilitado, agrega un enlace simbólico a un directorio. El enlace se lee durante el inicio y se inicia en el orden apropiado.
Para obtener más detalles sobre los parámetros disponibles, lo animo a profundizar en la página de manual de systemd.service.
Cómo es un servicio one-shot
Lo más simple un trago El servicio podría verse así:
[Unit]
Description=A simple oneshot service
[Service]
Type=oneshot
ExecStart=/bin/bash -c "echo Hello world"
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
El servicio se llama en el arranque del sistema. pero que hace RemainAfterExit
¿hacer? La página de manual no es exactamente útil:
Toma un valor booleano que especifica si el servicio se considerará activo incluso cuando todos sus procesos hayan salido. Por defecto es no.
Esencialmente, si RemainAfterExit=no
se deja sin especificar cuando se ejecuta el servicio, el estado se vuelve inactive (dead)
. Esto puede tener efectos posteriores en los servicios dependientes, ya que el servicio en realidad nunca hace la transición a un active
Expresar.
Encadenamiento de comandos en un servicio oneshot
Uno de los beneficios más poderosos de un un trago el servicio está encadenando múltiples ExecStart
y ExecStop
parámetros por ejemplo, un un trago service podría encadenar varios comandos como este:
[Unit]
Description=A oneshot service with many start and stop execs
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash -c "echo First"
ExecStart=/bin/bash -c "echo Second"
ExecStart=/bin/bash -c "echo Third"
ExecStop=/bin/bash -c "echo Fourth"
ExecStop=/bin/bash -c "echo Fifth"
ExecStop=/bin/bash -c "echo Sixth"
[Install]
WantedBy=multi-user.target
En un inicio del sistema, el servicio anterior hará eco First
, Second
, Third
y en un evento de apagado, se repetirá Fourth
, Fifth
, Sixth
. Dejando a un lado la simplicidad del ejemplo, existe un potencial significativo para esta capacidad.
Creación de un servicio único
creas un un trago servicio como cualquier otro servicio. Un archivo de servicio creado por el usuario debe residir en /etc/systemd/system/
mientras que los servicios del sistema existen en /usr/lib/systemd/system
.
No hay una guía explícita en la página del manual para los permisos de archivo, pero mirando los servicios en /usr/lib/systemd/system
los archivos normales son esencialmente todos -rw-r--r--
o 644
.
Después de generar un archivo de servicio, debe volver a cargar la configuración de systemd con systemctl daemon-reload
.
Después de eso, funciona como cualquier otro servicio. Puede habilitarlo para que comience en el arranque con systemctl enable foo.service
y manipular el estado del servicio con systemctl start foo.service
, systemctl stop foo.service
y así.
Un ejemplo de servicio de una sola vez
El ejemplo anterior es simple, pero aquí hay un escenario más realista:
Está utilizando AWS y tiene el servicio de metadatos IMDSv2 habilitado y accesible en su instancia. Tiene varias etiquetas de recursos en su instancia y tiene un script que consulta el servicio de metadatos para los valores de las etiquetas. También ejecuta un agente binario que envía métricas a un servicio de monitoreo de terceros en el servidor. Desea adjuntar esas etiquetas de recursos a su servicio de monitoreo y enviar alertas de preparación al flujo de eventos en ese servicio.
Con el escenario anterior, puede lograrlo con un sencillo un trago Servicio:
[Unit]
Description=Query metadata and attach to monitoring service
[Service]
Type=oneshot
RemainAfterExit=yes
#This script querys the IMDSv2 endpoint for resource tags and saves them into a configuration file
ExecStart=/usr/local/bin/metadata.sh
#This script sends an event to the monitoring service, the parameter start declares the system is starting up
ExecStart=/usr/local/bin/eventNotifier.sh start
#Same script as above, but sends a system stop message to the monitoring service.
ExecStop=/usr/local/bin/eventNotifier.sh stop
[Install]
WantedBy=multi-user.target
Envolver
Cuando se considera la flexibilidad de systemd y el uso de conceptos como el encadenamiento de servicios, el atractivo de un trago servicios se hace más evidente. Si bien los ejemplos presentados anteriormente son funcionales, son muy simples para mostrar cómo construir un un trago Servicio.