Cómo reiniciar mi servicio systemd cuando se actualiza su dependencia


11

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.servicey 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.


PartOf=Suena como la solución correcta. ¿Lo intentaste con Requires=eliminado?
meuh

@meuh Lo intenté ahora con Requires=eliminado, eso no ayudó. Creo que el problema es que PartOf=vincula "detener y reiniciar unidades", pero Postgres no se reinicia durante una actualización. Se detuvo, actualizó y comenzó.
Rennex

Curiosamente, cuando lo hace systemctl restart postgresql, systemd recuerda reiniciar sus servicios dependientes nuevamente. Parece apto, por alguna razón, combina stopy startno en lugar de restart.
WGH

Respuestas:


13

Encontré la respuesta: necesitaba cambiar la última línea del archivo de servicio a:

WantedBy=postgresql.service

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:

# systemctl enable tabill.service
Failed to execute operation: Too many levels of symbolic links

El mensaje de error fue engañoso. Arreglarlo fue simple:

# systemctl disable tabill.service
Removed symlink /etc/systemd/system/tabill.service.
Removed symlink /etc/systemd/system/multi-user.target.wants/tabill.service.

# systemctl enable tabill.service
Failed to execute operation: No such file or directory

# systemctl enable /srv/tabill/tabill.service
Created symlink from /etc/systemd/system/postgresql.service.wants/tabill.service to /srv/tabill/tabill.service.
Created symlink from /etc/systemd/system/tabill.service to /srv/tabill/tabill.service.

Ahora mi servicio se detiene y comienza cada vez que Postgres lo hace. Y, naturalmente, Postgres comienza cuando se inicia el sistema.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.