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.service
et 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.
la source
PartOf=
sonne comme la bonne solution. L'avez-vous essayé avecRequires=
supprimé?Requires=
supprimé, cela n'a pas aidé. Je pense que le problème est que lesPartOf=
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é.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 destop
etstart
au lieu derestart
.Réponses:
J'ai trouvé la réponse: je devais changer la dernière ligne du fichier de service en:
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é:Le message d'erreur était trompeur. Le réparer était simple:
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.
la source