Servicios y systemd

Pasé algún tiempo la semana pasada a hurgar systemd y tratando de averiguar cómo funcionan ciertas cosas. No puedo afirmar que sea un experto, sin embargo, pero yo descubro algunas cosas que me pareció muy útil.

Si intenta iniciar un servicio en una máquina con systemd (Fedora-15, por ejemplo), que en realidad se ve diferente después con un inicio al estilo SysV tradicional />


[root @ localhost ~] # service mongod empezar
A partir mongod: [OK]
[root @ localhost ~] # service mongod parada
mongod Detener: [OK]
[root @ localhost ~] # / etc / init.d / mongod start
mongod inicio: [OK]
[root @ localhost ~] # / etc / init.d / mongod parar
Detener mongod: [OK]
[root @ localhost ~] #

Systemd:

 
[root @ localhost ~] # service mongod empezar
mongod inicio (vía systemctl): [OK]
[root @ localhost ~] # service stop mongod
Detener mongod (vía systemctl): [OK]
[root @ localhost ~] # / etc / init.d / mongod empezar
A partir mongod (vía systemctl ): [OK]
[root @ localhost ~] # / etc / init.d / mongod parar
Detener mongod (vía systemctl): [OK]
[root @ localhost ~] #

«(a través de systemctl)» es un pequeño pero importante cambio en la forma de iniciar los servicios. Con guiones de estilo SysV, los scripts se ejecutan más o menos directamente de la shell bash que son lanzados desde (el «Servicio» binario hace un poco más en términos de limpieza del medio ambiente, pero aún así termina exec’ing la secuencia de comandos en el extremo).

Con systemd todo esto cambia. Una de las primeras cosas que casi todos los scripts de inicio hacer es source / etc / init.d / functions. En un sistema systemd habilitados, lo primero que / etc / init.d / functions hace es ejecutar systemctl y luego salir (ignorando el resto del script de inicio). ¿Qué systemctl es poner un mensaje en dbus pidiendo el servicio que ha especificado que debe iniciarse. SystemD sí está escuchando en dbus, cuando ve un mensaje como este, que recoge el mensaje y procede a actuar en consecuencia. En primer lugar, mira a ver si hay un archivo de unidad de systemd nativo para este servicio, y si la hay, se inicia el servicio de acuerdo con el archivo de la unidad nativa y devuelve el estado a systemctl, que devuelve el estado de servicio. Si no hay ningún archivo de unidad de systemd nativo, luego mira en / etc / init.d para un script legado. Si se encuentra uno, entonces el tenedor y el ejecutivo de ese guión, y devuelve el estado de systemctl, que devuelve el servicio.

Esto lleva a uno de los problemas más visibles con systemd, en que no hay salida si el guión de inicio falla. Es decir, si usted está usando un script de inicio de estilo legado y estás acostumbrado a cierta salida se muestra cuando algo falla, no se puede mostrar más puesto que la producción era consumida por systemd sí mismo y no regresó a systemctl.

Una forma de lidiar con esto es para omitir la redirección de servicio a systemctl. Hay diferentes maneras de hacerlo dependiendo de si usted está utilizando el «servicio» binary o si se está ejecutando la secuencia de comandos directamente. Si está utilizando el binario de servicio, se entiende una nueva bandera para omitir la redirección a systemd: servicio

 - iniciar skip-redirigir foo 

Si está ejecutando directamente el guión de inicio, lo necesario para pasar una variable de entorno:

 SYSTEMCTL_SKIP_REDIRECT = 1 / etc / init.d / foo start 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *