Escribí un programa que usa una base de datos Postgres y escribí un archivo de servicio systemd para él. Actualmente mi servicio se inicia en el arranque muy bien, y se detiene cuando Postgres se detiene para actualizar (por apt upgrade
). Sin embargo, cuando se completa la actualización y Postgres se inicia nuevamente, mi servicio no se inicia automáticamente.
¿Puedo definir alguna dependencia para que mi servicio vuelva a iniciarse automáticamente?
Este es el estado de mi servicio después de que se detuvo automáticamente durante la actualización de Postgres:
● tabill.service - My service
Loaded: loaded (/srv/tabill/tabill.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Tue 2017-07-04 00:29:24 EEST; 44min ago
Main PID: 1048 (code=killed, signal=TERM)
Tenga en cuenta que puedo iniciar manualmente el servicio nuevamente bien.
Aquí está mi archivo de servicio:
[Unit]
Description=My service
Wants=nginx.service
Requires=postgresql.service
After=postgresql.service
[Service]
Type=simple
ExecStart=/srv/tabill/app/serve
Restart=always
TimeoutSec=60
[Install]
WantedBy=multi-user.target
Intenté agregar PartOf=postgresql.service
y BindsTo=postgresql.service
, y luego detener y comenzar manualmente Postgres, pero ninguno ayudó.
Por supuesto, podría eliminar el Requires
, pero es preferible detener ambos servicios juntos, si solo ambos volvieran a comenzar.
fuente
PartOf=
Suena como la solución correcta. ¿Lo intentaste conRequires=
eliminado?Requires=
eliminado, eso no ayudó. Creo que el problema es quePartOf=
vincula "detener y reiniciar unidades", pero Postgres no se reinicia durante una actualización. Se detuvo, actualizó y comenzó.systemctl restart postgresql
, systemd recuerda reiniciar sus servicios dependientes nuevamente. Parece apto, por alguna razón, combinastop
ystart
no en lugar derestart
.Respuestas:
Encontré la respuesta: necesitaba cambiar la última línea del archivo de servicio a:
De esta manera, cada vez que se inicia Postgres, mi servicio también se inicia, pero si mi servicio falla, eso no detiene Postgres.
Las directivas en la
[Install]
sección solo afectan la habilitación y deshabilitación de las unidades. Pero no fue así de simple cuando mi servicio ya estaba habilitado:El mensaje de error fue engañoso. Arreglarlo fue simple:
Ahora mi servicio se detiene y comienza cada vez que Postgres lo hace. Y, naturalmente, Postgres comienza cuando se inicia el sistema.
fuente