GNU/Linux >> Linux Esercitazione >  >> Linux

Arresto dell'unità Systemd insieme a un'altra. Inizio lavori?

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.

Correlati:il selettore di data Bootstrap funziona solo sulla prima riga di GridView?

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 .


Linux
  1. Linux:come ottenere meno Tty con Systemd?

  2. Perché Systemd interrompe il servizio immediatamente dopo l'avvio?

  3. Come configurare Systemd per trasformare un semplice script con Standardio in un servizio di rete?

  4. Come controllare la risorsa (cgroup) con systemd per il gruppo di processi utente in CentOS/RHEL 7

  5. Come interrompere il servizio systemd

Come eseguire il contenitore Jenkins come servizio Systemd con Docker

Come eseguire container come servizio Systemd con Podman

Elenco dei servizi Linux con Systemctl

Comandi Systemctl per gestire il servizio Systemd

Installa ed esegui Jenkins con Systemd e Docker

Gestire cgroup con systemd