GNU/Linux >> Znalost Linux >  >> Linux

Zastavení jednotky Systemd společně s jinou. Zahájení prací?

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

Související:Výběr data Bootstrap funguje pouze na prvním řádku GridView?

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 .


Linux
  1. Linux – jak získat méně Ttys s Systemd?

  2. Proč Systemd zastavuje službu ihned po jejím spuštění?

  3. Systemd Run Unit na úspěchu jiného?

  1. Jak nakonfigurovat Systemd tak, aby jednoduchý skript pomocí Standardio převedl do síťové služby?

  2. Jak ovládat prostředek (cgroup) pomocí systemd pro skupinu uživatelských procesů v CentOS/RHEL 7

  3. Jak zastavit službu systemd

  1. Jak spravovat služby Systemd pomocí Systemctl v systému Linux

  2. Jak vyřešit neočekávané spouštění a zastavování služby MySQL

  3. Jak spustím skript před vším ostatním při vypnutí pomocí systemd?