Na serveru CentOS7 mám zásobník aplikací složený z webového serveru Tomcat a serveru MySQL DB, oba nainstalované na stejném virtuálním počítači.
Chtěl bych, aby se spouštěly a zastavovaly společně v tomto pořadí:
START: MySQL--> Tomcat STOP: Tomcat-->MySQL
Při čtení dokumentace k systemd unit se mi podařilo je spustit společně s Requires=
ale když zastavím tomcat pomocí systemctl stop tomcat.service, MySQL běží dál. V systémových protokolech jsem si všiml, že se ani nepokouší zastavit MySQL, takže musí být něco v nepořádku s jednotkou systemd.
Zde je moje jednotka:
# 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
Přijatá odpověď:
To, co zde vidíte, je očekávané chování systému. Requires=
závislost zajistí mysql.service
se spustí vždy, když tomcat.service
spustí, ale po spuštění jsou dvě jednotky nezávislé a jedna se nezastaví, když druhá ano.
Pokud opravdu chcete mysql.service
bude zastaven, když tomcat.service
je, můžete použít PartOf=
direktiva, která spojuje jednotky při zastavení a restartu.
Pro příklad, který jste popsali (s mysql.service
zastavit kdykoli tomcat.service
je zastaveno), co potřebujete, je přidat PartOf=tomcat.service
na definici mysql.service
. Obvykle je nejlepším způsobem použít přepisovací soubor, což můžete provést pomocí systemctl edit mysql.service
který otevře textový editor s prázdným souborem, pak do něj můžete přidat tento úryvek:
[Unit]
PartOf=tomcat.service
To se uloží do souboru /etc/systemd/system/mysql.service.d/override.conf
který se stane součástí mysql.service
, můžete si to ověřit pomocí systemctl cat mysql.service
.
Po těchto změnách a systemctl daemon-reload
, mělo by to fungovat podle očekávání...
Pokud jde o objednávání, vše by mělo fungovat, jak očekáváte, s jediným After=mysql.service
máte v tomcat.service
, protože závislosti jsou při zastavování služeb respektovány v opačném pořadí. (Což v tomto případě znamená tomcat.service
bude zastaven jako první a poté mysql.service
.)
Zastavování jednotek tímto způsobem nemusí být vždy dobrý nápad... Možná trochu lepším přístupem je vytvořit samostatný .target
jednotku pro seskupení všech služeb, které chcete ovládat. Možná něco jako webservices.target
.
Tuto jednotku byste vytvořili s obsahem jako:
[Unit]
Description=Web Services
Requires=tomcat.service mysql.service
After=tomcat.target mysql.service
[Install]
WantedBy=multi-user.target
A pak mít oba tomcat.service
a mysql.service
nastavte PartOf=webservices.target
pomocí výše popsaného mechanismu potlačení.
Povolte cílovou jednotku pomocí systemctl enable webservices.target
a poté můžete obě služby spustit a zastavit společně pomocí systemctl start webservices.target
nebo systemctl stop webservices.target
.