Bifurcación en un script systemd

10

Quiero que el servicio systemd maneje la bifurcación (mi archivo no maneja la bifurcación por sí misma. Por lo tanto, confío en systemd para manejar eso)

Mi archivo de servicio:

[Unit]
Description=swamp services management service
After=syslog.target

[Service]
Type=forking
ExecStart=/usr/bin/swamp

[Install]
WantedBy=multi-user.target

Pregunta

¿Especificar lo Type=forkingsuficiente para lo que estoy tratando de lograr? ¿O es similar a esperar una bifurcación en el arranque que en realidad le dice al arranque (si entiendo correctamente, no estoy seguro de hacerlo, soy nuevo en la escritura de guiones iniciales) que mi servicio manejaría la bifurcación / demonización.

alonisser
fuente

Respuestas:

16

systemd tiene excelente documentación. Vea la página sobre archivos de servicio :

Si se establece en bifurcación, se espera que el proceso configurado con ExecStart = llame a fork () como parte de su inicio. Se espera que el proceso principal salga cuando se complete el inicio y se configuren todos los canales de comunicación. El niño continúa ejecutándose como el proceso principal del demonio. Este es el comportamiento de los demonios tradicionales de UNIX. Si se usa esta configuración, se recomienda usar también la opción PIDFile =, para que systemd pueda identificar el proceso principal del demonio. systemd procederá con el inicio de las unidades de seguimiento tan pronto como finalice el proceso principal.

Entonces, usar eso typesolo le dirá a systemd que espere hasta que swampregrese y luego considere que todavía se está ejecutando: hacer que eso suceda sigue siendo su responsabilidad ...

jasonwryan
fuente
55
Si el script no se bifurca, es oneshot(un script de ejecución corta típico) o simple(un servicio de larga duración que no se bifurca + sale).
Pavel Šimerda
44
¿Considerarías un script (Bash?) Para bifurcar otro proceso cuando funciona en segundo plano usando ampersand &?
Felipe Alvarez
55
@FelipeAlvarez sí, el operador ampersand en bash es equivalente a una bifurcación y un ejecutivo.
Thayne
1

Si desea que systemd maneje la bifurcación, entonces debe usar eg Type=simpleo Type=notify. Entonces systemd hará la bifurcación por usted.

Si puede modificar el swampejecutable, entonces Type=notifyes la mejor solución. El ejecutable debe notificar a systemd cuando se inicializa correctamente. Esto significa que systemctl start swampesperará a que el pantano se inicialice cuando se llame desde la línea de comando e imprima cualquier mensaje de error mientras se inicializa en la línea de comando, que es lo que generalmente desea.

Para ver un ejemplo de un ejecutable escrito para usar Type = notify, consulte el siguiente shellscript:

#!/bin/bash                                                                     
sleep 3
systemd-notify READY=1
sleep 1000000
usuario3049102
fuente