Comment faire pour redémarrer mon service systemd lorsque sa dépendance est mise à niveau

11

J'ai écrit un programme qui utilise une base de données Postgres et j'ai écrit un fichier de service systemd pour cela. Actuellement, mon service démarre très bien au démarrage, et il est arrêté lorsque Postgres est arrêté pour la mise à niveau (par apt upgrade). Cependant, une fois la mise à niveau terminée et Postgres redémarré, mon service n'est pas démarré automatiquement.

Puis-je définir une certaine dépendance pour redémarrer automatiquement mon service?

Voici l'état de mon service après son arrêt automatique lors de la mise à niveau 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)

Notez que je peux redémarrer manuellement le service très bien.

Voici mon dossier de service:

[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

J'ai essayé d'ajouter PartOf=postgresql.serviceet BindsTo=postgresql.service, puis d'arrêter et de démarrer manuellement Postgres, mais aucun n'a aidé.

Bien sûr, je pourrais supprimer le Requires, mais arrêter les deux services ensemble est préférable, si seulement ils redémarraient tous les deux.

Rennex
la source
PartOf=sonne comme la bonne solution. L'avez-vous essayé avec Requires=supprimé?
meuh
@meuh Je l'ai essayé maintenant avec Requires=supprimé, cela n'a pas aidé. Je pense que le problème est que les PartOf=liens "arrêt et redémarrage des unités", mais Postgres n'est pas redémarré lors d'une mise à niveau. Il est arrêté, mis à niveau et démarré.
Rennex
Curieusement, lorsque vous le faites systemctl restart postgresql, systemd se souvient de redémarrer à nouveau ses services dépendants. Il semble qu'apt, pour une raison quelconque, fasse une combinaison de stopet startau lieu de restart.
WGH

Réponses:

13

J'ai trouvé la réponse: je devais changer la dernière ligne du fichier de service en:

WantedBy=postgresql.service

De cette façon, chaque fois que Postgres est démarré, mon service démarre également - mais si mon service échoue, cela n'arrête pas Postgres.

Les directives de la [Install]section affectent uniquement l'activation et la désactivation des unités. Mais ce n'était pas aussi simple lorsque mon service était déjà activé:

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

Le message d'erreur était trompeur. Le réparer était 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.

Maintenant, mon service s'arrête et démarre chaque fois que Postgres le fait. Et naturellement Postgres démarre au démarrage du système.

Rennex
la source