Come riavviare il mio servizio systemd quando viene aggiornata la sua dipendenza


11

Ho scritto un programma che utilizza un database Postgres e per questo ho scritto un file di servizio systemd. Attualmente il mio servizio viene avviato correttamente all'avvio e si interrompe quando Postgres viene arrestato per l'aggiornamento (da apt upgrade). Tuttavia, quando l'aggiornamento è completo e Postgres viene riavviato, il mio servizio non viene avviato automaticamente.

Posso definire alcune dipendenze per riavviare automaticamente il mio servizio?

Questo è lo stato del mio servizio dopo che è stato interrotto automaticamente durante l'aggiornamento di 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)

Si noti che posso riavviare manualmente il servizio bene.

Ecco il mio file di servizio:

[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

Ho provato ad aggiungere PartOf=postgresql.servicee BindsTo=postgresql.service, quindi a interrompere e avviare manualmente Postgres, ma nessuno dei due ha aiutato.

Ovviamente potrei rimuovere il Requires, ma è preferibile interrompere entrambi i servizi, se solo avessero entrambi riavviato.


PartOf=sembra la soluzione giusta. L'hai provato con Requires=rimosso?
Meuh

@meuh L'ho provato ora con Requires=rimosso, che non ha aiutato. Penso che il problema sia che PartOf=collega "l'arresto e il riavvio delle unità", ma Postgres non viene riavviato durante un aggiornamento. È stato arrestato, aggiornato e avviato.
Rennex,

In modo abbastanza divertente, quando lo fai systemctl restart postgresql, systemd ricorda di riavviare nuovamente i suoi servizi dipendenti. Sembra che apt, per qualche ragione, combini stope startinvece di restart.
WGH,

Risposte:


13

Ho trovato la risposta: avevo bisogno di cambiare l'ultima riga del file di servizio in:

WantedBy=postgresql.service

In questo modo, ogni volta che viene avviato Postgres, viene avviato anche il mio servizio, ma se il mio servizio fallisce, ciò non arresta Postgres.

Le direttive nella [Install]sezione riguardano solo l'abilitazione e la disabilitazione delle unità. Ma non era così semplice quando il mio servizio era già abilitato:

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

Il messaggio di errore era fuorviante. Risolvere il problema è stato semplice:

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

Ora il mio servizio si interrompe e inizia ogni volta che Postgres lo fa. E naturalmente Postgres inizia all'avvio del sistema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.