Su un server CentOS7 ho uno stack applicativo composto da un web server Tomcat e da un server DB MySQL, entrambi installati sulla stessa VM.
Vorrei che si avviassero e si fermassero insieme in questo ordine:
START: MySQL--> Tomcat STOP: Tomcat-->MySQL
Leggendo la documentazione dell'unità systemd, sono riuscito a farli iniziare insieme a Requires=
direttiva, ma quando interrompo tomcat con systemctl stop tomcat.service, MySQL continua a funzionare. Nei log di sistema ho notato che non tenta nemmeno di fermare MySQL, quindi deve esserci qualcosa che non va nell'unità systemd.
Ecco la mia unità:
# Systemd unit file for tomcat [Unit] Description=Apache Tomcat Web Application Container After=syslog.target network.target mysql.service Requires=mysql.service [Service] Type=forking Environment=JAVA_HOME=/opt/jdk Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid Environment=CATALINA_HOME=/opt/tomcat Environment=CATALINA_BASE=/opt/tomcat ExecStart=/opt/tomcat/bin/startup.sh ExecStop=/bin/kill -15 $MAINPID User=tomcat Group=tomcat [Install] WantedBy=multi-user.target
Risposta accettata:
Quello che vedi qui è il comportamento previsto di systemd. Il Requires=
la dipendenza assicurerà mysql.service
viene avviato ogni volta che tomcat.service
parte, ma una volta avviate le due unità sono indipendenti e una non si fermerà quando lo sarà l'altra.
Se vuoi davvero mysql.service
da interrompere quando tomcat.service
cioè puoi usare PartOf=
direttiva che collega le unità all'arresto e al riavvio.
Per l'esempio che hai descritto (con mysql.service
fermati ogni volta che tomcat.service
è interrotto), quello che ti serve è aggiungere PartOf=tomcat.service
alla definizione di mysql.service
. Di solito, il modo migliore per farlo è usare un file di override, che puoi fare con systemctl edit mysql.service
che aprirà un editor di testo con un file vuoto, quindi puoi aggiungere questo snippet:
[Unit]
PartOf=tomcat.service
Questo verrà salvato in un file /etc/systemd/system/mysql.service.d/override.conf
che diventa parte di mysql.service
, puoi verificarlo con systemctl cat mysql.service
.
Dopo queste modifiche e un systemctl daemon-reload
, dovrebbe funzionare come ti aspetti...
Per quanto riguarda l'ordinazione, tutto dovrebbe funzionare come previsto con il singolo After=mysql.service
hai in tomcat.service
, poiché le dipendenze vengono rispettate nell'ordine inverso quando si arrestano i servizi. (Che significa, in questo caso, tomcat.service
verrà interrotto per primo, seguito da mysql.service
.)
Fermare le unità in questo modo potrebbe non essere sempre una buona idea... Forse un approccio leggermente migliore è creare un .target
separato unità per raggruppare tutti i servizi che si desidera controllare insieme. Forse qualcosa come webservices.target
.
Creerai quell'unità con contenuti come:
[Unit]
Description=Web Services
Requires=tomcat.service mysql.service
After=tomcat.target mysql.service
[Install]
WantedBy=multi-user.target
E poi avere entrambi tomcat.service
e mysql.service
imposta un PartOf=webservices.target
, utilizzando il meccanismo di override descritto sopra.
Abilita l'unità di destinazione con systemctl enable webservices.target
, quindi puoi avviare e interrompere entrambi i servizi insieme a systemctl start webservices.target
o systemctl stop webservices.target
.